Acronyms
ACLED Armed Conflict Location and Event Data Project
CCCM Camp Management and Camp Coordination
CSO Civil Society Organisation
FAO Food and Agriculture Organisation
FSC Food Security Cluster
HARP Humanitarian Assistance and Resilience Programme (DfID)
HNO Humanitarian Needs Overview
HRP Humanitarian Response Plan
IDP Internally Displaced Person
IERP Interim Emergency Response Plan
IFPRI International Food Policy Research Institute
MIMU Myanmar Information Management Unit (UN RC’s Office)
NNGO National Non-governmental Organisation
OCHA UN Office for the Coordination of Humanitarian Affairs
UXO Unexploded Ordnance
WFP World Food Programme


Introduction

This report provides an overview of the Armed Conflict Location and Event Data Project (ACLED) dataset for Myanmar. This dataset contains information on conflict actors, conflict events, event types, event locations and fatalities dating back to 2010. The data are updated on a monthly basis. With some notable exceptions, this report is largely focused on 2021 data.

The aim of ACLED is “to capture the forms, agents, dates and locations of political violence and protests”; its methodology for Myanmar consists of the review of English and Myanmar sources to code political violence and demonstration events: the vast majority (85%) of their information originates from subnational, national and international media sources, with the remainder originating from ACLED’s partnership with the Myanmar Peace Monitor and reports by the UN, international monitoring groups and local human rights organisations. Points of alignment and divergence from the conflict events collected by the Nexus Response Mechanism’s Conflict Analysis and Research Facility remain to be explored.

The terminology employed with this report follows what has been laid out in the ACLED codebook; the review of the codebook, as well as ACLED’s methodology notes on Myanmar, is highly encouraged. This report would like to highlight the excellent scholarship of the Armed Conflict Location and Event Data Project, as well as their dedication in making this wealth of data public. This report also echoes ACLED’s calls for increased protections for journalists and independent reporting.


References for this report

1. Progression of conflict events by interaction type in 2021

The GIF below shows 2021 conflict events by month. The colour of each point indicates the interaction type, which classify conflict events based on what type of actors were involved. The 6 most common interaction types have been included, with all the less frequent ones being recoded as “other”. The number of fatalities associated with each event indicated by the size of each point.

The type of interaction that resulted in the most fatalities were between the military and political militia (57% of fatalities), these were followed by military versus rebels (19%), then the military versus civilians (9%) and political militia versus civilians (8%). An alternative GIF, showing the progression of the conflict in 2021 by event type is shown in section 3.5.





2. Distribution of food security partners and conflict events in 2021

There is, in general, a dearth of partners in the parts of the country most affected by conflict, especially around Sagaing and Magway. Battles and explosions and remote violence were most prevalent in Sagaing, and, to lesser extents Kachin and Shan North. This presents a very clear picture that humanitarian partners, who have traditionally focused on Rakhine, Kachin and northern Shan have not allocated their resources in line with populations affected by conflict. Though the extent to which such decisions were influenced by OCHA’s focus on peri-urban areas in the IERP is unclear.





3. Progression and distribution of conflict events and fatalities

3.1 Annual distribution of conflict events and fatalities by event type

The plot below shows a massive spike in conflict events in 2021, bearing in mind that Myanmar has long been embroiled in a 70-year civil war. Previously, when the MIMU-HARP Vulnerability Index was developed in 2016, climate risk, underdevelopment and conflict risk were all taken into account in the index with equal weighting. However, given the massive increase in conflict events, conflict indicators should be afforded much greater weights in any consideration of vulnerability and the reorientation of activities around conflict loci is very much warranted.



The 2021 breakdown of conflict events in 2021 was:

2021 event types by percentage of total
event_type count percentage
Protests 5,973 36.73
Strategic developments 3,262 20.06
Explosions/Remote violence 2,734 16.81
Battles 2,296 14.12
Violence against civilians 1,891 11.63
Riots 107 0.66
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


There were more conflict fatalities in 2021 than from 2010 to 2020 combined. However, reactions to these changes in context have been slow – were a cyclone to have caused more fatalities than all extreme weather events for the previous ten years, one might have expected more urgency and drastic reallocation of resources.

There were more fatalities related to violence against civilians alone than all conflict-related fatalities in 2019, which previously had the highest number of fatalities this decade.




3.2 Progression of conflict events in 2021

Battles, explosions and remote violence and strategic developments rose steadily until May 2021, then experienced a brief decline before rising again in September 2021. Protests and riots peaked in March 2021, right after the coup. Events involving violence against civilians grew in frequency throughout the year, though a slight decline in intensity was noted at the end of the year.



It is currently unknown what caused the relative dip in the intensity of conflict events in June and July, though it is currently hypothesised the very heavy fighting in May might have led to a lull in activity where actors regroup and rethink their strategies – the People’s Defence Force was formed in May 2021. The spike in arrests in May might also have contributed as mass arrests might have diminished the capacities of certain actors to engage in conflict events. Or, this relative dip in conflict also coincides with the sowing periods for paddy. As a note, the sub-event type “Attack” is the most common category of the “Violence against civilians” event type.




3.3 Conflict fatalities in 2021

Battles and explosions/remote violence were the largest contributors to conflict fatalities in 2021.



Worryingly, violence against civilians formed 15% of all conflict fatalities:

2021 conflict fatalities by event type
event_type fatalities percentage
Battles 6,540 56.84
Explosions/Remote violence 2,590 22.51
Violence against civilians 1,729 15.03
Protests 375 3.26
Riots 252 2.19
Strategic developments 20 0.17
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


However, the event type “Violence against civilians” does not encompass all fatal incidents involving non-combatants. Once the data is examined through the lens of interaction type, which records the types of actors involved in each conflict event, it should be

It should be noted that 20.14% of fatalities stem from interactions involving non-combatants – that is, civilians and protesters. The next chapter deals with a more detailed calculation for the number of fatalities related to non-combatants.



The largest numbers of fatalities are related to events involving the military, political militias (including the People’s Defense Force) and rebel groups:

2021 conflict fatalities by interaction type
inter_type fatalities percentage
military versus political militia 6,543 56.87
military versus rebels 2,163 18.80
military versus civilians 1,048 9.11
political militia versus civilians 881 7.66
Other 469 4.08
military versus protesters 372 3.23
sole political militia action 30 0.26
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.4 Geographic distribution of conflict events in 2021



Sagaing saw the highest number of conflict events as well as fatalities in 2021, in particular, it experienced more than three times as many conflict-related fatalities than the next highest region, Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.




3.5 Progression of the conflict in 2021 by event type

The GIF below shows 2021 conflict events by month. The colour of each point indicates the type of conflict event. The number of fatalities associated with each event is indicated by the size of each point. It is interesting to note that after the protests in February and March 2021, the conflict moves on to a new stage in April and May, visibly increasing in intensity.





4. Non-combatants

4.1 Conflict events involving non-combatants


It is estimated that 28.9% of the 11,506 conflict-related fatalities involved non-combatants.

In this chapter, the ACLED dataset has been filtered down to events involving non-combatants: the filter applied selected events under the event_type “Violence against civilians”, conflict interactions involving civilians or protesters and any events with the word “civilian”, “protester” or “villager” in their description. Peaceful protests were filtered out as these were largely one-sided events (where the only actors were protesters) and did not result in property damage or casualties. These events involving non-combatants have been plotted in the map below: conflict events with fatalities are coloured red.


The specific breakdown of sub-event types involving non-combatants were:

Top 10 sub-event types involving non-combatants in 2021
sub_event_type events fatalities
Abduction/forced disappearance 140 0
Air/drone strike 17 47
Armed clash 272 929
Arrests 1,595 0
Attack 1,738 1,727
Excessive force against protesters 219 375
Looting/property destruction 611 0
Other 289 43
Protest with intervention 452 0
Remote explosive/landmine/IED 367 165
Shelling/artillery/missile attack 146 39
Data sources: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.2 Events and fatalities involving non-combatants by state


The plot above shows the breakdown of events and fatalities involving non-combatants by state and region. The high numbers of events in Sagaing, Mandalay and Yangon are due to high incidences of arrests and attacks on civilians. However, the ratio of attacks vs. arrests is significantly higher in Sagaing than those other two regions:

Main sub-event types and fatalities involving non-combatants by state/region
state Arrests Attack Looting/property destruction Protest with intervention Remote explosive/landmine/IED Other Fatalities
Sagaing 250 440 237 29 52 216 1,178
Mandalay 238 304 55 68 43 78 411
Yangon 232 250 54 123 56 75 300
Magway 163 166 85 21 27 80 274
Shan-North 45 83 27 44 56 185 181
Kachin 87 72 24 36 17 95 148
Kayin 25 28 12 14 16 75 120
Kayah 24 32 11 7 6 51 117
Tanintharyi 78 72 19 16 5 30 114
Chin 27 28 28 10 12 32 112
Mon 59 69 13 16 17 27 93
Shan-South 75 49 7 18 14 64 87
Bago-East 39 40 5 7 6 22 78
Ayeyarwady 143 53 22 18 16 17 49
Bago-West 54 27 5 2 7 7 33
Rakhine 27 12 4 12 16 18 19
Naypyitaw 19 10 1 11 1 9 9
Shan-East 10 3 2 0 0 2 2
Data sources: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


Kale in Sagaing saw the highest proportions of fatalities involving non-combatants in 2021 – 7% of non-combatant-related fatalities occurred there, or 238 persons. 229 townships reported fatalities involving non-combatants in 20201. Of the top 20 townships in terms of fatalities involving non-combatants, 11 of them were in Sagaing:





5. Conflict actors

5.1 Conflict events by type of actor

The next two sections summarise conflict events and fatalities by event type and actor type. For the plots below, one should bear in mind that most event types (with the exception of peaceful protests) involved more than one actor, so totalling up each facet will result in a number higher than the total number of events. For instance, the same battle involving state forces and rebel groups would show up in the event counts of each.



2021 number of conflict events by actor type
actor_type state_forces protesters civilians political_militias rebel_groups rioters identity_militias external_other_force
events 7,938 6,021 4,850 4,585 1,585 116 3 5
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.2 Fatalities by actor type

The plot below on fatalities shows the number of fatalities associated with each type of actor. It should be noted that the ACLED dataset does not have a column to assign blame. Similar to the plot on event types above, duplications have been included, though not within the totals for each actor type.

For instance, under fatalities related to protests, 381 fatalities were associated with protesters, with the main other party involved almost entirely being state forces, with very small numbers being associated with rioters.



2021 number of fatalities associated with each actor type
actor_type state_forces protesters civilians political_militias rebel_groups rioters identity_militias external_other_force
fatalities 9,983 373 1,871 7,363 2,184 260 3 0
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.3 Which actors are associated with the most fatalities?

The table below summarises the number of fatalities and conflict events associated with the largest actors. The table has been sorted in descending order of number of fatalities; only actors associated with more than 100 fatalities are shown and all other actors have been lumped together as “Other”.

Top 2021 actors in terms of fatalities; actors associated with less than 100 fatalities have been lumped together as ‘Other’
actor actor_type fatalities events fatalities_per_event
Military Forces of Myanmar state_forces 9,540 6,993 1.36
People’s Defense Force political_militias 3,335 1,110 3.00
Civilians (Myanmar) civilians 1,871 4,844 0.39
Other 1,420 1,239 1.15
Unidentified Armed Group (Myanmar) political_militias 934 2,299 0.41
KIO/KIA rebel_groups 758 668 1.13
KNU/KNLA rebel_groups 713 251 2.84
CDF political_militias 657 161 4.08
Protesters (Myanmar) protesters 373 6,021 0.06
Police Forces of Myanmar state_forces 359 779 0.46
MNTJP/MNDAA rebel_groups 328 157 2.09
YDF political_militias 297 31 9.58
Unidentified Local Defense Forces (Myanmar) political_militias 276 101 2.73
Rioters (Myanmar) rioters 260 116 2.24
KNDF political_militias 214 57 3.75
PPDF political_militias 203 34 5.97
KNPP/KA rebel_groups 197 72 2.74
PRA political_militias 168 28 6.00
Pyu Saw Htee political_militias 134 142 0.94
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


As mentioned, it is difficult at this juncture to state how many of the associated fatalities were persons killed by these groups and how many were members of these groups had been the ones who were killed. Still, it is worthwhile to plot which actors are the “bloodiest”, at least in regards to the outcomes of their actions, or have been involved in incidents with the most fatalities.

The plot below seeks to examine which actors have been associated with the most fatalities per event, and only actors which have participated in more than 50 conflict events have been included. The point shows the average number of fatalities associated with each actor per conflict event it was involved in. The whiskers show the upper and lower ranges of fatalities per event, that is, 95% of all conflict events that an actor participated in fell within that range. The highest numbers of fatalities per event are associated with political militias and rebel groups.




5.4 Summary table of main conflict actors by actor type

Top 5 conflict actors in 2021 by actor type
actor_type actor_name events %_of_group
state_forces
state_forces Military Forces of Myanmar 6,993 88.10
state_forces Police Forces of Myanmar 779 9.81
state_forces Government of Myanmar (2021-) 67 0.84
state_forces Military Forces of Myanmar - Border Guard Force 43 0.54
state_forces People’s Militia Force 43 0.54
protesters
protesters Protesters (Myanmar) 6,021 100.00
civilians
civilians Civilians (Myanmar) 4,844 99.88
civilians Civilians (Australia) 2 0.04
civilians Civilians (China) 1 0.02
civilians Civilians (International) 1 0.02
civilians Civilians (Japan) 1 0.02
civilians Civilians (United States) 1 0.02
political_militias
political_militias Unidentified Armed Group (Myanmar) 2,299 50.14
political_militias People’s Defense Force 1,110 24.21
political_militias CDF: Chinland Defense Force 161 3.51
political_militias Pyu Saw Htee 142 3.10
political_militias Unidentified Local Defense Forces (Myanmar) 101 2.20
rebel_groups
rebel_groups KIO/KIA: Kachin Independence Organization/Kachin Independence Army 668 42.15
rebel_groups KNU/KNLA: Karen National Union/Karen National Liberation Army 251 15.84
rebel_groups RCSS/SSA-S: Restoration Council of Shan State/Shan State Army-South 168 10.60
rebel_groups MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 157 9.91
rebel_groups PSLF/TNLA: Palaung State Liberation Front/Ta’ang National Liberation Army 123 7.76
rioters
rioters Rioters (Myanmar) 116 100.00
identity_militias
identity_militias Unidentified Communal Militia (Myanmar) 3 100.00
external_other_force
external_other_force Private Security Forces (Myanmar) 4 80.00
external_other_force ASEAN: Association of Southeast Asian Nations 1 20.00
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.5 Geographic distribution of conflict actors

Sagaing, again, is an outlier and is home to a massive concentration of conflict actors, exceeding even traditionally-targeted areas in Kachin, northern Shan and Rakhine.





6. Correlations between conflict and food security cluster footprint

6.1 Correlation plot

The correlation plot below compares the major conflict indicators with those the numbers of FSC partners and beneficiaries at township level. The darker the colours and the larger the circles, the greater the degree of correlation, with +1 being a perfect positive correlation and -1 being a perfect negative correlation. To see a specific relationship, find the square where two variables intersect. For instance, the correlation between the number of battles and the number of FSC beneficiaries is the last square in the first row.

Conflict indicators tend to be highly correlated with each other. Only very weak correlations are noted between the presence of FSC partners beneficiaries and the incidence of conflict.



Additional detail is rendered in this next, larger correlation plot. It keeps all the same variables as the plot above, but just provides some more information. The plot below is split into upper and lower triangles, divided down the diagonal by the histograms in blue.

The numbers in the upper triangle are the specific numeric values of the blue and yellow circles above, indicating the correlation coefficient (between +1 and -1), with the asterisks denoting the level of statistical significance of these correlations. The histograms down the diagonal show the distribution of each variable – for the conflict variables, the bars are skewed to the left, indicating that most townships have relatively low levels of conflict.

This is borne out in an examination of the lower triangle, where each point is a township and the red line shows the linear fit between each pair of variables. Most townships tend to be concentrated around the bottom-left quadrant of the chart, with many outliers. The steeper the gradient of red line, the stronger the correlation.

For instance, the two variables most highly-correlated with each other are violence against civilians and strategic developments: they share a correlation coefficient of 0.79, meaning that in 79% of the townships in which violence against civilians occurred, strategic developments also took place (the most common strategic developments were arrests and property damage). This relationship is statistically significant, that is to say, it was not by chance that these two types of conflict events tended to occur in the same places.



The numbers of partners and beneficiaries per township were, unsurprisingly, correlated with each other. However, the number of partners per township was only slightly correlated with the number of battles and the number of explosions and remote violence – this pattern likely only holds for certain states. The number of beneficiaries reached is not correlated with any conflict indicators.



6.2 Revisiting the MIMU-HARP conflict index

A conflict score was then calculated using ACLED data: its construction was similar to the conflict index in the MIMU-HARP Vulnerability Analysis, with the notable omission of data on displacement – this has been requested and the score will be updated once that data has been made available.

The conflict score – at its most basic level – is an average of the normalised values of battles, explosions and remote violence, violence against civilians, strategic developments, non-peaceful protests and riots and the conflict-related fatalities. However, these normalised values have be re-weighted with the Betti-Verma method, which penalises redundancy and rewards variation; this is the other notable divergence from MIMU-HARP’s methodology. The Betti-Verma method was employed through the mdepriv R package developed by Atillio Benini and Aldo Benini.

Below is a plot of townships comparing the conflict score with the number of beneficiaries.



As expected, from reviewing the correlation plot above and from the flat blue line, the incidence of conflict (represented by the conflict score, where higher values indicate higher incidence of conflict) has no discernible relationship – positive or negative – with the number of FSC beneficiaries. The blue line just shows a simple linear model, the summary of which is printed below:


  Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.102 0.01493 6.831 0.0000000002926
beneficiaries 0.00000005841 0.0000001266 0.4612 0.6454
partners -0.001092 0.00547 -0.1997 0.8421
Summary of linear model
Observations Residual Std. Error \(R^2\) Adjusted \(R^2\)
133 0.112 0.001634 -0.01373



6.3 Township-level distributions of conflict events and fatalities

The scatterplot below shows the distribution of conflict events and fatalities by township. The means of both number of conflict events and number of fatalities have been marked by dotted red lines, dividing the plot into four quadrants. Whilst more detailed prioritisation is warranted, it is already very clear that interventions should be targeted at, above all, the 57 townships in the upper-right quadrant; that is, those which have experienced an above average number of conflict fatalities and events. More detailed information can be obtained from the township reference table in section 9.1.





7. Agriculture and conflict

7.1 Summary of agricultural statistics


The last year in which detailed township-level agricultural statistics were made available was 2016, these were included in the MIMU-HARP report Vulnerability in Myanmar. It is also important to note that the main reason these statistics were released was due to the development of the 2015/2016 National Recovery Framework and Plan for Floods and Landslides, meaning that some of the values, especially related to area harvested, are anomalous. However, agricultural areas sown are unlikely to have shifted greatly in the past 6 years – – indeed, the sown area of paddy has only varied by 0.1% between 2015/2016 and 2018/2019 when being compared at the national level.

The plot below shows the state/regional breakdown of the total sown area in acres in 2015/2016 by major crop type. Ayeyarwady, Sagaing, Bago and Magway contain the main agricultural production areas of Myanmar. Though Mandalay, Magway and Sagaing show a much higher diversity of crop types compared to other states/regions which are dominated by paddy.



Although the 2015/2016 agricultural data were released to document the losses from floods and landslides, much can still be gleaned from aggregating the data. With reference to the table below, it is very important to note that the net margins per acre were lowest for paddy, meaning that areas with greater levels of crop diversification will be suffer greater economic impacts from conflict events. But only general trends can be gleaned from the net margins of crops as 2015/2016 were anomalous due to the widespread flooding and landslides.


Net margin per acre of major crops (2015)
crop_type net_margin_usd harvested_area_acres harvested_area_% margin_per_acre_usd
maize 351,623,671 1,144,769 3.36 307
green_gram 686,210,129 2,915,748 8.57 235
pigeon_pea 375,384,475 1,596,547 4.69 235
sun_flower_seeds 174,790,202 1,144,227 3.36 153
groundnut 302,247,466 2,305,150 6.77 131
urad_pea 293,636,574 2,717,568 7.99 108
sesame 319,141,771 3,904,036 11.47 82
paddy 1,176,706,195 17,367,234 51.03 68
Data source: Ministry of Agriculture, Livestock and Irrigation (2015/2016)



7.2 Conflict index and agriculture

Conflict has a real effect on food prices, as demonstrated by the International Food Policy Research Institute (IFPRI) in their working paper Agricultural value chains in a fragile state: the case of rice in Myanmar. IFPRI noted that whilst neither paddy nor milled rice had not seen any major price changes after the coup, the retail price of rice has been noticeably higher since the coup. This is in line with a steep increase in food vendors surveyed experiencing “local farmer supply difficulties” and “outside village supply difficulties.

All this indicates that the conflict has been impacting agricultural supply chains and prices – an 11% increase in the retail prices of rice were noted after the coup. IFPRI noted that “an additional 10 violent events in the month-of and month before price measurement was associated with a 1 and 2 percent increase in price dispersion at the mill and vendor levels […] the impact of 10 violent events is approximately equivalent to a 167-333 km of distance between mills and vendors.”

In light of these findings, the FSC visualises below the intersection of acres of land sown and the newly-recalculated conflict index. The treemap below shows townships according to their state/region and the total area sown in them (size of the rectangle) and the severity of conflict (colour).

To ensure food security in Sagaing, Magway, Mandalay, Mon, Kayin, Kachin and Kayah, livelihood programming should be predicated on safe access to agricultural land and markets. A more thorough analysis of market access in these areas is warranted; facilitating access between producers, millers and vendors in these areas will contribute to the stabilisation of prices. There is also the necessity for mine-risk education as many areas might be contaminated by UXOs (see the GIF in section 3.4 to see where explosions and remote violence have occurred).

Agricultural areas in Ayeyarwady, Bago, Yangon, Rakhine and Shan (East) have been less affected by conflict events and fatalities, indicating that access to fields and markets not been disrupted and existing livelihoods programme designs may be sufficient in these areas.



The next treemap uses the same area scale as the one above (where the size corresponds to the acres of agricultural land sown), but the colours of each township have been recalculated to reflect the net margins that townships earn in 2015/2016 from agricultural production. It bears mentioning again that the net margins in 2015/2016 were anomalous, with the country having been affected by widespread and severe flooding and landslides.

Of note is that is that whilst Ayeyarwady has the largest cultivated area of all the states and regions, its share of the net margins per acre tended to be lower than in many other parts of the country. This is largely due to the much higher levels of crop diversification in Magway and Sagaing or rather, the predominance of paddy cultivation in Ayeyarwady.




7.3 Maps of conflict events, fatalities and agricultural area sown

Click here to see interactive versions of these maps. Please note that these maps are quite large and will take a long time to load. Static versions are found below.




8. Text mining the ACLED dataset

8.1 Network graph of correlated words

This chapter focuses on data mining the text within the column notes of the ACLED dataset, which contains a descriptions of each conflict event. For this first section, the relationships between individual words in the conflict descriptions have been presented in a network graph. Each word is a node and the opacity of the line denotes the strength of its correlation to other words (that is, the probability that they have been used to describe the same conflict event). Only words that have appeared more than 70 times in the dataset are shown:


conflict network graph click here to see the full-sized graph.


The first cluster of note is around the word “protests”, these are linked to words such as “coup” and “disobedience”; below it is another closely-related cluster containing the words “live”, “rubber”, “bullets”, “disperse” and “crowd”. It can be fairly easily surmised that these words are related to conflict events surrounding the February 2021 coup and the mass demonstrations in response to it – the word “February” is also closely linked with these clusters.

Another cluster of note centres around the words “remote”, “controlled” and “explosives”, and is closely linked to the words “convoy”, “trucks” and “landmines” — these words are likely linked to events where military convoys were bombed and ambushed by People’s Defence Forces.

There is also the Kachin cluster, centred around “Myitkyina”, “Waingmaw”, “Monhyin”, “Hpakant”, “Bhamo” and the “KIA”, the Kachin Independence Army. Noticeably, this cluster also has links with the words “battalion” and “jet” and “fighters”.

This network graph is not intended to be an exhaustive record of the conflict events in 2021 and merely intends to provide an overview: only words which appeared more than 70 times in the ACLED dataset and had a correlation of 0.2 or more were included. The inclusion of words with too few occurrences might also include those with spurious correlations;but the readability of the graph was also a factor. Click on the link to see the graph at full-size and explore it further.

As a minor addendum to the network graph, the plot below shows the top 20 words most likely to be associated with each type of conflict event. For instance, the word “clashed” is most likely to appear in the descriptions of battles than any of the other event types.




8.2 Pairwise correlations

To complement the network graph above, the table below shows correlations between individual words in the ACLED dataset conflict descriptions (that is, how often they were used to describe the same event) – this is especially useful if there is a word of interest that the reader would like to explore in further detail. To reduce the size of table loaded, only words which have appeared more than 50 times in 2021 and only the top 20 matches per word have been included. A correlation of 1 means that the word always appears with its match in the dataset; a correlation of 0.5 means that the word appears in the same event as its match 50% of the time.

Use the filter above the column word to try out different words – try starting with “artillery”, “protest”, “landmine” or a location of interest. All words are in lower case. The search bar will look in both columns and may prove less useful than the filter bar.



As a minor addendum, below is a plot of the top 30 words associated with conflict events that resulted in fatalities (“yes”, in red) and those that did not (“no”, in blue). They are ranked below in order of their odds of being described conflict events that did and did not result in fatalities – with reference to the plot below, the words “shot”, “soldiers”, “injured”, “PDF” and “military are the most likely to be be used in descriptions of conflict events that resulted in fatalities. The words”displacement”, “change”, “formed”, “arrested” and “offices” were least likely to be used to describe events that resulted in fatalities.

An interesting next step might be to try and develop a predictive model based on the various conflict descriptions to understand which types of events are more likely to result in conflict fatalities.




8.3 Sources used by the ACLED dataset

As mentioned, these words originate from the ACLED dataset’s descriptions of each conflict event. In the vast majority of cases, these conflict descriptions are articles from various news sources.

A total of 67 news sources were used in the ACLED dataset. About a third of the conflict events in 2021 included in the ACLED dataset were originally reported in the Democratic Voice of Burma. To assess the completeness and reliability of the ACLED dataset, a more thorough analysis of the news sources it makes use of should be conducted. Additionally, comparisons should be made between ACLED’s methodology and that of the Nexus Response Mechanism. The most common news sources are listed in the plot below, in order of the share of 2021 conflict events attributed to them.





9. Next steps

  • Re-calculate the conflict score once IDP data is obtained and compare these results to previous results recorded by MIMU-HARP in their vulnerability analysis. To note, displacement is likely to be highly correlated with the other conflict indicators (this was the case with the MIMU-HARP conflict index). Nevertheless, it was a key component of the MIMU-HARP model and its inclusion will aid in improving comparability.

  • Compare the conflict score and specific conflict indicators to results of the WFP-FAO food insecurity survey. It is important to understand if there are any significant correlations between the two. Filter the conflict data to only include time periods relevant to WFP-FAO’s study. Additionally, conflict scores should be cross-referenced with market prices to see if a predictive model can be established. Additionally, begin the comparison of conflict data and data on malnutrition. There will likely be many challenges in obtaining accurate mortality rates of any kind.

  • Compare conflict indicators to market prices to identify if battles and other violent incidents have had impacts on food prices and their stability; explore if a predictive model can be developed.

  • Review findings with other humanitarian stakeholders; develop area-specific products, if necessary. It is important to review the conflict score with other stakeholders to assess appetite for its adoption. Most of the data used for its generation is easily accessible and regularly updated, though it remains to be seen to what extent this is true for the data on displacement.

  • Compare ACLED data against MIMU’s hard-to-reach areas dataset.

  • Cross-reference conflict data with partner presence and achievements of other clusters.




10. Reference maps and tables

10.1 Conflict events in 2021 aggregated at township level



10.2 Conflict actors in 2021



10.3 Reference maps

Interactive versions of some of these maps can be found here. Please note that these maps are quite large and will take a long time to load.

LS0tDQp0aXRsZTogIkFuIEFuYWx5c2lzIG9mIEFDTEVEIERhdGEiDQpzdWJ0aXRsZTogIlVuZGVyc3RhbmRpbmcgdGhlIENvbmZsaWN0IER5bmFtaWNzIGluIE15YW5tYXIgdGhyb3VnaCBDb25mbGljdCBhbmQgSW5jaWRlbnQgRGF0YTogQSBGb29kIFNlY3VyaXR5IFBlcnNwY3RpdmUiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIxMS8wMi8yMDIyIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlICAgDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciB0YWJsZS1hY3JvbnltcywgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRyaWJibGUoDQogIH5hY3JvbnltLCB+bmFtZSwgDQogICJBQ0xFRCIsICJBcm1lZCBDb25mbGljdCBMb2NhdGlvbiBhbmQgRXZlbnQgRGF0YSBQcm9qZWN0IiwNCiAgIkNDQ00iLCAiQ2FtcCBNYW5hZ2VtZW50IGFuZCBDYW1wIENvb3JkaW5hdGlvbiIsDQogICJDU08iLCAiQ2l2aWwgU29jaWV0eSBPcmdhbmlzYXRpb24iLA0KICAiRkFPIiwgIkZvb2QgYW5kIEFncmljdWx0dXJlIE9yZ2FuaXNhdGlvbiIsDQogICJGU0MiLCAiRm9vZCBTZWN1cml0eSBDbHVzdGVyIiwNCiAgIkhBUlAiLCAiSHVtYW5pdGFyaWFuIEFzc2lzdGFuY2UgYW5kIFJlc2lsaWVuY2UgUHJvZ3JhbW1lIChEZklEKSIsDQogICJITk8iLCAiSHVtYW5pdGFyaWFuIE5lZWRzIE92ZXJ2aWV3IiwNCiAgIkhSUCIsICJIdW1hbml0YXJpYW4gUmVzcG9uc2UgUGxhbiIsDQogICJJRFAiLCAiSW50ZXJuYWxseSBEaXNwbGFjZWQgUGVyc29uIiwgDQogICJJRVJQIiwgIkludGVyaW0gRW1lcmdlbmN5IFJlc3BvbnNlIFBsYW4iLA0KICAiSUZQUkkiLCAiSW50ZXJuYXRpb25hbCBGb29kIFBvbGljeSBSZXNlYXJjaCBJbnN0aXR1dGUiLA0KICAiTUlNVSIsICJNeWFubWFyIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQgVW5pdCAoVU4gUkMncyBPZmZpY2UpIiwNCiAgIk5OR08iLCAiTmF0aW9uYWwgTm9uLWdvdmVybm1lbnRhbCBPcmdhbmlzYXRpb24iLCANCiAgIk9DSEEiLCAiVU4gT2ZmaWNlIGZvciB0aGUgQ29vcmRpbmF0aW9uIG9mIEh1bWFuaXRhcmlhbiBBZmZhaXJzIiwNCiAgIlVYTyIsICJVbmV4cGxvZGVkIE9yZG5hbmNlIiwNCiAgIldGUCIsICJXb3JsZCBGb29kIFByb2dyYW1tZSINCikgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIioqQWNyb255bXMqKiIsIGNvbC5uYW1lcyA9IE5VTEwpICU+JSANCiAga2FibGVfY2xhc3NpY18yKHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KPGJyPg0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyByZXBvcnQgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKSBkYXRhc2V0IGZvciBNeWFubWFyLiBUaGlzIGRhdGFzZXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gY29uZmxpY3QgYWN0b3JzLCBjb25mbGljdCBldmVudHMsIGV2ZW50IHR5cGVzLCBldmVudCBsb2NhdGlvbnMgYW5kIGZhdGFsaXRpZXMgZGF0aW5nIGJhY2sgdG8gMjAxMC4gVGhlIGRhdGEgYXJlIHVwZGF0ZWQgb24gYSBtb250aGx5IGJhc2lzLiBXaXRoIHNvbWUgbm90YWJsZSBleGNlcHRpb25zLCB0aGlzIHJlcG9ydCBpcyBsYXJnZWx5IGZvY3VzZWQgb24gMjAyMSBkYXRhLiANCg0KVGhlIGFpbSBvZiBBQ0xFRCBpcyAidG8gY2FwdHVyZSB0aGUgZm9ybXMsIGFnZW50cywgZGF0ZXMgYW5kIGxvY2F0aW9ucyBvZiBwb2xpdGljYWwgdmlvbGVuY2UgYW5kIHByb3Rlc3RzIjsgaXRzIG1ldGhvZG9sb2d5IGZvciBNeWFubWFyIGNvbnNpc3RzIG9mIHRoZSByZXZpZXcgb2YgRW5nbGlzaCBhbmQgTXlhbm1hciBzb3VyY2VzIHRvIGNvZGUgcG9saXRpY2FsIHZpb2xlbmNlIGFuZCBkZW1vbnN0cmF0aW9uIGV2ZW50czogdGhlIHZhc3QgbWFqb3JpdHkgKDg1JSkgb2YgdGhlaXIgaW5mb3JtYXRpb24gb3JpZ2luYXRlcyBmcm9tIHN1Ym5hdGlvbmFsLCBuYXRpb25hbCBhbmQgaW50ZXJuYXRpb25hbCBtZWRpYSBzb3VyY2VzLCB3aXRoIHRoZSByZW1haW5kZXIgb3JpZ2luYXRpbmcgZnJvbSBBQ0xFRCdzIHBhcnRuZXJzaGlwIHdpdGggdGhlIE15YW5tYXIgUGVhY2UgTW9uaXRvciBhbmQgcmVwb3J0cyBieSB0aGUgVU4sIGludGVybmF0aW9uYWwgbW9uaXRvcmluZyBncm91cHMgYW5kIGxvY2FsIGh1bWFuIHJpZ2h0cyBvcmdhbmlzYXRpb25zLiBQb2ludHMgb2YgYWxpZ25tZW50IGFuZCBkaXZlcmdlbmNlIGZyb20gdGhlIGNvbmZsaWN0IGV2ZW50cyBjb2xsZWN0ZWQgYnkgdGhlIE5leHVzIFJlc3BvbnNlIE1lY2hhbmlzbSdzIENvbmZsaWN0IEFuYWx5c2lzIGFuZCBSZXNlYXJjaCBGYWNpbGl0eSByZW1haW4gdG8gYmUgZXhwbG9yZWQuDQoNClRoZSB0ZXJtaW5vbG9neSBlbXBsb3llZCB3aXRoIHRoaXMgcmVwb3J0IGZvbGxvd3Mgd2hhdCBoYXMgYmVlbiBsYWlkIG91dCBpbiB0aGUgQUNMRUQgY29kZWJvb2s7IHRoZSByZXZpZXcgb2YgdGhlIGNvZGVib29rLCBhcyB3ZWxsIGFzIEFDTEVEJ3MgbWV0aG9kb2xvZ3kgbm90ZXMgb24gTXlhbm1hciwgaXMgaGlnaGx5IGVuY291cmFnZWQuIFRoaXMgcmVwb3J0IHdvdWxkIGxpa2UgdG8gaGlnaGxpZ2h0IHRoZSBleGNlbGxlbnQgc2Nob2xhcnNoaXAgb2YgdGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QsIGFzIHdlbGwgYXMgdGhlaXIgZGVkaWNhdGlvbiBpbiBtYWtpbmcgdGhpcyB3ZWFsdGggb2YgZGF0YSBwdWJsaWMuIFRoaXMgcmVwb3J0IGFsc28gZWNob2VzIEFDTEVEJ3MgY2FsbHMgZm9yIGluY3JlYXNlZCBwcm90ZWN0aW9ucyBmb3Igam91cm5hbGlzdHMgYW5kIGluZGVwZW5kZW50IHJlcG9ydGluZy4NCg0KPGJyPg0KDQojIyMgUmVmZXJlbmNlcyBmb3IgdGhpcyByZXBvcnQNCiogQUNMRUQsICgyMDE5KS4gQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKSBDb2RlYm9vay4gaHR0cHM6Ly93d3cuYWNsZWRkYXRhLmNvbS93cC1jb250ZW50L3VwbG9hZHMvZGxtX3VwbG9hZHMvMjAxNy8xMC9BQ0xFRF9Db2RlYm9va18yMDE5RklOQUxfcGJsLnBkZi4NCiogQUNMRUQsICgyMDIyKS4gQUNMRUQgZGF0YSBmb3IgTXlhbm1hciAoMjAxMC0yMDIyKS4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tLg0KKiBBQ0xFRCwgKDIwMjApLiBBQ0xFRCBNZXRob2RvbG9neSBhbmQgQ29kaW5nIERlY2lzaW9ucyBhcm91bmQgUG9saXRpY2FsIFZpb2xlbmNlIGluIE15YW5tYXIuIGh0dHBzOi8vYWNsZWRkYXRhLmNvbS9hY2xlZGRhdGFuZXcvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMTEvQUNMRURfUG9saXRpY2FsLVZpb2xlbmNlLWluLU15YW5tYXJfRmVicnVhcnktMjAyMC5wZGYuDQoqIEF0aWxsaW8gQmVuaW5pLCBBbGRvIEJlbmluaSAoMjAyMSkuIG1kZXByaXY6IFN5bnRoZXRpYyBzY29yZXMgb2YgbXVsdGlwbGUgZGVwcml2YXRpb24uIFIgcGFja2FnZSB2ZXJzaW9uIDAuMC4zLiAgaHR0cHM6Ly9naXRodWIuY29tL2EtYmVuaW5pL21kZXByaXYvLg0KKiBGb29kIFNlY3VyaXR5IENsdXN0ZXIsIE15YW5tYXIgKDIwMjEpLiA1V3MgcmVwb3J0aW5nIHRvb2wuDQoqIEhBUlAtRiBhbmQgTUlNVSAoMjAxOCkuIFZ1bG5lcmFiaWxpdHkgaW4gTXlhbm1hcjogQSBTZWNvbmRhcnkgRGF0YSBSZXZpZXcgb2YgTmVlZHMsIENvdmVyYWdlIGFuZCBHYXBzLiBodHRwOi8vdGhlbWltdS5pbmZvL3Z1bG5lcmFiaWxpdHktaW4tbXlhbm1hci4NCiogSUZQUkkgKDIwMjIpLiBBZ3JpY3VsdHVyYWwgdmFsdWUgY2hhaW5zIGluIGEgZnJhZ2lsZSBzdGF0ZTogdGhlIGNhc2Ugb2YgcmljZSBpbiBNeWFubWFyLiBodHRwczovL3d3dy5pZnByaS5vcmcvcHVibGljYXRpb24vYWdyaWN1bHR1cmFsLXZhbHVlLWNoYWlucy1mcmFnaWxlLXN0YXRlLWNhc2UtcmljZS1teWFubWFyLg0KKiBTaWxnZSBKLCBSb2JpbnNvbiBEICgyMDE2KS4gdGlkeXRleHQ6IFRleHQgTWluaW5nIGFuZCBBbmFseXNpcyBVc2luZyBUaWR5IERhdGEgUHJpbmNpcGxlcyBpbiBSLiBKT1NTLCAxKDMpLiBkb2k6IDEwLjIxMTA1L2pvc3MuMDAwMzcsIGh0dHA6Ly9keC5kb2kub3JnLzEwLjIxMTA1L2pvc3MuMDAwMzcuDQo8YnI+PGJyPjxicj4NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZnV6enlqb2luKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoczIpDQpsaWJyYXJ5KGJvb2tkb3duKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3NmbGFiZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkod2lkeXIpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2lmc2tpKQ0KbGlicmFyeShwbmcpDQpsaWJyYXJ5KHRyYW5zZm9ybXIpDQpsaWJyYXJ5KG1kZXByaXYpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeSh4dGFibGUpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkodHJlZW1hcCkNCmxpYnJhcnkodHJlZW1hcGlmeSkNCmxpYnJhcnkodGlkeWxvKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyBjdW11YWx0aXZlIGNvdW50DQpjdW1jb3VudCA8LSBmdW5jdGlvbih4KXsNCiAgY3VtY291bnQgPC0gbnVtZXJpYyhsZW5ndGgoeCkpDQogIG5hbWVzKGN1bWNvdW50KSA8LSB4DQoNCiAgZm9yKGkgaW4gMTpsZW5ndGgoeCkpew0KICAgIGN1bWNvdW50W2ldIDwtIHN1bSh4WzE6aV09PXhbaV0pDQogIH0NCg0KICByZXR1cm4oY3VtY291bnQpDQp9DQoNCiMgcmVhZGluZyBpbiB0b3duc2hpcHMgZnJvbSBnZW9hZG1pbnMgDQp0b3duc2hpcHMgPC0gcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChhZG1pbjFwY29kZV80OmFkbWluM3Bjb2RlKSAlPiUgDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBhZG1pbjFwY29kZV80LA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gYWRtaW4zcGNvZGUsDQogICAgICAgICBzdGF0ZV9uYW1lICAgPSBzdGF0ZV81LA0KICAgICAgICAgdG93bnNoaXBfbmFtZSAgPSBjb3VudHkpICU+JSANCiAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0YXRlX25hbWUgPT0gIk1hZ3dheSIgJiB0b3duc2hpcF9uYW1lID09ICJNaW5obGEiLCAiTU1SMDA5MDEzIiwgYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGlmZWxzZShzdGF0ZV9uYW1lID09ICJZYW5nb24iICYgdG93bnNoaXBfbmFtZSA9PSAiSHRhbnRhYmluIiwgIk1NUjAxMzAwNiIsIGFkbWluM19wY29kZSkpDQoNCiMgcmVhZGluZyBpbiBhY2xlZA0KYWNsZWQgPC0gcmVhZF9leGNlbCgiMjAxMC0wMS0wMS0yMDIyLTAxLTI1LU15YW5tYXIueGxzeCIsIA0KICAgICAgICAgc2hlZXQgPSAiMjAxMC0yMDIxLUNsZWFuZWQiKSAlPiUgDQogIG11dGF0ZShhZG1pbjMgPSByZWNvZGUoYWRtaW4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtU291dGgiID0gIkRhZ29uIE15b3RoaXQgKFNvdXRoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1Ob3J0aCIgPSAiRGFnb24gTXlvdGhpdCAoTm9ydGgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LVNlaWtrYW4iID0gIkRhZ29uIE15b3RoaXQgKFNlaWtrYW4pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LUVhc3QiID0gIkRhZ29uIE15b3RoaXQgKEVhc3QpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJIbGFpbmd0aGFyeWEtRWFzdCIgPSAiSGxhaW5ndGhhcnlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJIbGFpbmd0aGFyeWEtV2VzdCIgPSAiSGxhaW5ndGhhcnlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJQYW5nc2FuZyIgPSAiUGFuZ3NhbmcgKFBhbmdoa2FtKSIpKSAlPiUgDQogICMgbG9jYXRpb25zIGluIHlhbmdvbiB3aXRoIGxvbmdsYXQsIGJ1dCBubyBhZG1pbjMgaGF2ZSBiZWVuIGNvZGVkIGFzIEt5YXVrdGFkYSwgd2hlcmUgY2l0eSBoYWxsIGlzOw0KICAjIHNpbWlsYXJseSwgaW4gbWFuZGFsYXksIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBDaGFuYXlldGhhemFuIGFuZCBaYXkgeWFyIHRoaSByaSBpbiBOUFQNCiAgbXV0YXRlKGFkbWluMyA9IGNhc2Vfd2hlbihpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMTYuODA1MiB+ICJLeWF1a3RhZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDE5Ljc0NTAgfiAiWmF5IFlhciBUaGkgUmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDIxLjk3NDcgfiAiQ2hhbmF5ZXRoYXphbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gYWRtaW4zKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSAgDQogICAgICAgICAgICAgIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9IGMoImFkbWluMyIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogIGdyb3VwX2J5KGRhdGFfaWQpICU+JSANCiAgc2xpY2Uod2hpY2gubWluKGV2ZW50X2lkX25vX2NudHkpKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGludGVyX3R5cGUgPSBpbnRlcmFjdGlvbiwNCiAgICAgICAgIGludGVyX3R5cGUgPSByZWNvZGVfZmFjdG9yKGludGVyX3R5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxMGAgPSAiU09MRQlNSUxJVEFSWSBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTFgID0gIk1JTElUQVJZIFZFUlNVUyBNSUxJVEFSWSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxMmAgPSAiTUlMSVRBUlkgVkVSU1VTIFJFQkVMUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxM2AgPSAiTUlMSVRBUlkgVkVSU1VTIFBPTElUSUNBTCBNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDE0YCA9ICJNSUxJVEFSWSBWRVJTVVMgQ09NTVVOQUwgTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxNWAgPSAiTUlMSVRBUlkgVkVSU1VTIFJJT1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTZgID0gIk1JTElUQVJZIFZFUlNVUyBQUk9URVNURVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDE3YCA9ICJNSUxJVEFSWSBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDE4YCA9ICJNSUxJVEFSWSBWRVJTVVMgT1RIRVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjBgID0gIlNPTEUgUkVCRUwgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIyYCA9ICJSRUJFTFMgVkVSU1VTIFJFQkVMUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyM2AgPSAiUkVCRUxTCVZFUlNVUyBQT0xJVElDQUwgTUlMSUlUQSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjRgID0gIlJFQkVMUyBWRVJTVVMgQ09NTVVOQUwgTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyNWAgPSAiUkVCRUxTIFZFUlNVUyBSSU9URVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDI2YCA9ICJSRUJFTFMgVkVSU1VTIFBST1RFU1RFUlMgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDI3YCA9ICJSRUJFTFMgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyOGAgPSAiUkVCRUxTIFZFUlNVUyBPVEhFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzBgID0gIlNPTEUgUE9MSVRJQ0FMIE1JTElUSUEgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDMzYCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgUE9MSVRJQ0FMCU1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzRgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBDT01NVU5BTAlNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDM1YCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgUklPVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzNmAgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIFBST1RFU1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzdgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzhgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBPVEhFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDBgID0gIlNPTEUgQ09NTVVOQUwgTUlMSVRJQSBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDRgID0gIkNPTU1VTkFMIE1JTElUSUEgVkVSU1VTIENPTU1VTkFMIE1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDVgID0gIkNPTU1VTkFMIE1JTElUSUEgVkVSU1VTIFJJT1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDZgID0gIkNPTU1VTkFMCU1JTElUSUEJVkVSU1VTIFBST1RFU1RFUlMgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQ3YCA9ICJDT01NVU5BTCBNSUxJVElBIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDhgID0gIkNPTU1VTkFMIE1JTElUSUEgVkVSU1VTIE9USEVSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDUwYCA9ICJTT0xFIFJJT1RFUiBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNTVgID0gIlJJT1RFUlMgVkVSU1VTIFJJT1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNTZgID0gIlJJT1RFUlMgVkVSU1VTIFBST1RFU1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNTdgID0gIlJJT1RFUlMgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1OGAgPSAiUklPVEVSUyBWRVJTVVMgT1RIRVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDYwYCA9ICJTT0xFIFBST1RFU1RFUiBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNjZgID0gIlBST1RFU1RFUlMgVkVSU1VTIFBST1RFU1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNjdgID0gIlBST1RFU1RFUlMgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2OGAgPSAiUFJPVEVTVEVSUyBWRVJTVVMgT1RIRVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNzhgID0gIk9USEVSIEFDVE9SIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgODBgID0gIlNPTEUgT1RIRVIgQUNUSU9OIiksIA0KICAgICAgICAgaW50ZXJfdHlwZSA9IHRvbG93ZXIoc3RyX3RyaW0oc3RyX3JlcGxhY2VfYWxsKGludGVyX3R5cGUsICJbXFxyXFxuXFx0XSsiLCAiICIpKSkpICU+JSANCiAgbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShhZG1pbjNfcGNvZGUgPT0gIk1NUjAwNzAxNCIgJiBhZG1pbjEgPT0gIllhbmdvbiIsICJNTVIwMTMwMDYiLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gaWZlbHNlKGFkbWluMSA9PSAiTWFnd2F5IiAmIGFkbWluMyA9PSAiTWluaGxhIiwgIk1NUjAwOTAxMyIsIGFkbWluM19wY29kZSkpICU+JSANCiAgbXV0YXRlKGhhc19mYXRhbGl0aWVzID0gaWZlbHNlKGZhdGFsaXRpZXMgPiAwLCBUUlVFLCBGQUxTRSkpICU+JQ0KICBtdXRhdGUobW9udGggPSBsdWJyaWRhdGU6Om1vbnRoKGV2ZW50X2RhdGUsIGxhYmVsID0gVFJVRSkpICU+JQ0KICBtdXRhdGUobm9uX2NvbWJhdGFudCA9IGNhc2Vfd2hlbihldmVudF90eXBlID09ICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIgfiBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChpbnRlcl90eXBlLCAiY2l2aWxpYW58cHJvdGVzdGVyIikgfiBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChub3RlcywgImNpdmlsaWFufHByb3Rlc3Rlcnx2aWxsYWdlciIpIH4gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBGQUxTRSkpDQoNCiMgYWN0b3ItbGV2ZWwgZGF0YXNldA0KYWN0b3JzIDwtIHJlYWRfY3N2KCIxOTAwLTAxLTAxLTIwMjItMDItMDktTXlhbm1hci5jc3YiKSAlPiUgDQogIG11dGF0ZShhZG1pbjMgPSByZWNvZGUoYWRtaW4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtU291dGgiID0gIkRhZ29uIE15b3RoaXQgKFNvdXRoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1Ob3J0aCIgPSAiRGFnb24gTXlvdGhpdCAoTm9ydGgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LVNlaWtrYW4iID0gIkRhZ29uIE15b3RoaXQgKFNlaWtrYW4pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LUVhc3QiID0gIkRhZ29uIE15b3RoaXQgKEVhc3QpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJIbGFpbmd0aGFyeWEtRWFzdCIgPSAiSGxhaW5ndGhhcnlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJIbGFpbmd0aGFyeWEtV2VzdCIgPSAiSGxhaW5ndGhhcnlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJQYW5nc2FuZyIgPSAiUGFuZ3NhbmcgKFBhbmdoa2FtKSIpKSAlPiUgDQogICMgbG9jYXRpb25zIGluIHlhbmdvbiB3aXRoIGxvbmdsYXQsIGJ1dCBubyBhZG1pbjMgaGF2ZSBiZWVuIGNvZGVkIGFzIEt5YXVrdGFkYSwgd2hlcmUgY2l0eSBoYWxsIGlzOw0KICAjIHNpbWlsYXJseSwgaW4gbWFuZGFsYXksIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBDaGFuYXlldGhhemFuIGFuZCBaYXkgeWFyIHRoaSByaSBpbiBOUFQNCiAgbXV0YXRlKGFkbWluMyA9IGNhc2Vfd2hlbihpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMTYuODA1MiB+ICJLeWF1a3RhZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDE5Ljc0NTAgfiAiWmF5IFlhciBUaGkgUmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDIxLjk3NDcgfiAiQ2hhbmF5ZXRoYXphbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gYWRtaW4zKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSAgDQogICAgICAgICAgICAgIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9IGMoImFkbWluMyIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChpbnRlcmFjdGlvbiwgaW50ZXJfdHlwZSkgJT4lICBkaXN0aW5jdCgpLCBieSA9ICJpbnRlcmFjdGlvbiIpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IGFjdG9yMSkgJT4lIA0KICBtdXRhdGUoYWN0b3Jfc2ltcGxlID0gDQogICAgICAgICAgIGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSdzIERlZmVuc2UgRm9yY2UiKSB+ICJQZW9wbGUncyBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUm9oaW5neWEgTXVzbGltIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJSb2hpbmd5YSBNdXNsaW0gR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiV29tZW4gXFwoTXlhbm1hclxcKSIpIH4gIldvbWVuIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIjIxIEd1ZXJyaWxsYSBGb3JjZSIpIH4gIjIxIEd1ZXJyaWxsYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIjI3IFJldm9sdXRpb24gRm9yY2UiKSB+ICIyNyBSZXZvbHV0aW9uIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiODggR2VuZXJhdGlvbiBQZWFjZSBhbmQgT3BlbiBTb2NpZXR5IikgfiAiODggR2VuZXJhdGlvbiBQZWFjZSBhbmQgT3BlbiBTb2NpZXR5IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQUJGU1UiKSB+ICJBQkZTVSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkFpZCBXb3JrZXJzIFxcKE15YW5tYXJcXCkiKSB+ICJBaWQgV29ya2VycyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJBeWFkYXcgQm9uZSBOYWluZyBQREYiKSB+ICJBeWFkYXcgQm9uZSBOYWluZyBQREYiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJCYXB0aXN0IENocmlzdGlhbiBHcm91cCIpIH4gIkJhcHRpc3QgQ2hyaXN0aWFuIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkJ1ZGRoaXN0IEdyb3VwIikgfiAiQnVkZGhpc3QgR3JvdXAgKE15YW5tYXIpIiwgDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNERjogQ2hpbmxhbmQgRGVmZW5zZSBGb3JjZSIpIH4gIkNERjogQ2hpbmxhbmQgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNoaW4gRXRobmljIEdyb3VwIikgfiAiQ2hpbiBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ2hpbmVzZSBFdGhuaWMgR3JvdXAiKSB+ICJDaGluZXNlIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDaHJpc3RpYW4gR3JvdXAiKX4gIkNocmlzdGlhbiBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDaXZpbGlhbnMgXFwoTXlhbm1hclxcKSIpIH4gIkNpdmlsaWFucyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDTk8vQ05ERiIpIH4gIkNOTy9DTkRGOiBDaGluIE5hdGlvbmFsIE9yZ2FuaXphdGlvbi9DaGluIE5hdGlvbmFsIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJES0JBIFxcKEJ1ZGRoaXN0XFwpIikgfiAiREtCQSAoQnVkZGhpc3QpOiBEZW1vY3JhdGljIEthcmVuIEJ1ZGRoaXN0IEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJGYXJtZXJzIFxcKE15YW5tYXJcXCkiKSB+ICJGYXJtZXJzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkRlbW9jcmF0aWMgR3VlcnJpbGxhIEZvcmNlIikgfiAiRGVtb2NyYXRpYyBHdWVycmlsbGEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJER1dDRiIpIH4gIkRHV0NGOiBEZWx0YSBHdWVycmlsbGEgV2FyZmFyZSBDb2xsZWN0aXZlIEZvcmNlcyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkZvcm1lciBHb3Zlcm5tZW50IG9mIE15YW5tYXIgXFwoMjAxNi1cXCkiKSB+ICJGb3JtZXIgR292ZXJubWVudCBvZiBNeWFubWFyICgyMDE2LSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJGb3JtZXIgR292ZXJubWVudCBvZiBNeWFubWFyIFxcKDIwMjEtXFwpIikgfiAiRm9ybWVyIEdvdmVybm1lbnQgb2YgTXlhbm1hciAoMjAyMS0pIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRm9ybWVyIE1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyIFxcKDIwMTYtMjAyMVxcKSIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJGb3JtZXIgTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIgKDIwMTYtMjAyMSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJGb3JtZXIgTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIgXFwoMjAyMS1cXCkiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWVyIE1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyICgyMDIxLSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgXFwoMjAxMS0yMDE2XFwpIikgfiAiR292ZXJubWVudCBvZiBNeWFubWFyICgyMDExLTIwMTYpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiR292ZXJubWVudCBvZiBNeWFubWFyIFxcKDIwMTYtXFwpIikgfiAiR292ZXJubWVudCBvZiBNeWFubWFyICgyMDE2LSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgXFwoMjAyMS1cXCkiKSB+ICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgKDIwMjEtKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkhlYWx0aCBXb3JrZXJzIFxcKE15YW5tYXJcXCkiKSB+ICJIZWFsdGggV29ya2VycyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJKb3VybmFsaXN0cyBcXChNeWFubWFyXFwpIikgfiAiSm91cm5hbGlzdHMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2FjaGluIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiS2FjaGluIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLCANCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2F5YWggRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKX4gIktheWFoIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXlpbiBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpfiAiS2F5aW4gRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkthcmVubmkgRGVtb2NyYXRpYyBGcm9udCIpIH4gIktERjogS2FyZW5uaSBEZW1vY3JhdGljIEZyb250IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS0lPL0tJQSIpIH4gIktJTy9LSUE6IEthY2hpbiBJbmRlcGVuZGVuY2UgT3JnYW5pemF0aW9uL0thY2hpbiBJbmRlcGVuZGVuY2UgQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkthcmVubmkgTmF0aW9uYWxpdGllcyBEZWZlbnNlIEZvcmNlIikgfiAiS05ERjogS2FyZW5uaSBOYXRpb25hbGl0aWVzIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXJlbm5pIE5hdGlvbmFsIFByb2dyZXNzaXZlIFBhcnR5IikgfiAiS05QUC9LQTogS2FyZW5uaSBOYXRpb25hbCBQcm9ncmVzc2l2ZSBQYXJ0eS9LYXJlbm5pIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXJlbiBOYXRpb25hbCBVbmlvbiIpIH4gIktOVS9LTkxBOiBLYXJlbiBOYXRpb25hbCBVbmlvbi9LYXJlbiBOYXRpb25hbCBMaWJlcmF0aW9uIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLbmlnaHRzIE9mIFRoZSBSZWQgTGFuZCIpIH4gIktPUkw6IEtuaWdodHMgT2YgVGhlIFJlZCBMYW5kIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS05VL0tOTEEgUGVhY2UgQ291bmNpbCIpIH4gIktQQzogS05VL0tOTEEgUGVhY2UgQ291bmNpbCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkxHQlQgXFwoTXlhbm1hclxcKSIpIH4gIkxHQlQgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTGFib3VyIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJMYWJvdXIgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTGlzdSBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIkxpc3UgRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1HNiBHdWVycmlsbGEgRm9yY2UiKSB+ICJNRzYgR3VlcnJpbGxhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTUhHOiBNb255d2EgSGVyb2VzIEdyb3VwIikgfiAiTUhHOiBNb255d2EgSGVyb2VzIEdyb3VwIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTUhIOiBNdW5nc2hhd2EgSHB5ZW4gSHB1bmciKSB+ICJNSEg6IE11bmdzaGF3YSBIcHllbiBIcHVuZyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkJvcmRlciBHdWFyZCBGb3JjZSIpIH4gIk1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyIC0gQm9yZGVyIEd1YXJkIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUG9saWNlIEZvcmNlcyBvZiBNeWFubWFyIikgfiAiUG9saWNlIEZvcmNlcyBvZiBNeWFubWFyIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlJ3MgTWlsaXRpYSBGb3JjZSIpIH4gIlBlb3BsZSdzIE1pbGl0aWEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciIpIH4gIk1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTU5USlAvTU5EQUE6IE15YW5tYXIgTmF0aW9uYWwgVHJ1dGggYW5kIEp1c3RpY2UgUGFydHkvTXlhbm1hciBOYXRpb25hbCBEZW1vY3JhdGljIEFsbGlhbmNlIEFybXkiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiTU5USlAvTU5EQUE6IE15YW5tYXIgTmF0aW9uYWwgVHJ1dGggYW5kIEp1c3RpY2UgUGFydHkvTXlhbm1hciBOYXRpb25hbCBEZW1vY3JhdGljIEFsbGlhbmNlIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNb24gRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJNb24gRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1vbnl3YSBOaWdodGtpbmciKSB+ICJNb255d2EgTmlnaHRraW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTW9ueXdhIFlvdW5nIFBlb3BsZSBHcm91cCIpIH4gIk1vbnl3YSBZb3VuZyBQZW9wbGUgR3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNcm8gRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJNcm8gRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1USFNGOiBNb24gVGhhdG9uIFNwZWNpYWwgRm9yY2VzIikgfiAiTVRIU0Y6IE1vbiBUaGF0b24gU3BlY2lhbCBGb3JjZXMiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNdXNsaW0gR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIk11c2xpbSBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNV1ZBOiBNeWFubWFyIFdhciBWZXRlcmFucycgQXNzb2NpYXRpb24iKSB+ICJNV1ZBOiBNeWFubWFyIFdhciBWZXRlcmFucycgQXNzb2NpYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJOTEQ6IE5hdGlvbmFsIExlYWd1ZSBmb3IgRGVtb2NyYWN5IikgfiAiTkxEOiBOYXRpb25hbCBMZWFndWUgZm9yIERlbW9jcmFjeSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBhLU9oIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiUGEtT2ggRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBhbGF1bmcvVGEnYW5nIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiUGFsYXVuZy9UYSdhbmcgRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBhbGUgSm9rZXIgUERGIikgfiAiUGFsZSBKb2tlcnMgUERGIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlJ3MgRGVmZW5zZSBGcm9jZSIpIH4gIlBlb3BsZSdzIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUgRGVmZW5zZSBGcm9jZSIpIH4gIlBlb3BsZSdzIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUncyBHdWVycmlsbGFzIENvbW1hbmRvIikgfiAiUGVvcGxlJ3MgR3VlcnJpbGxhcyBDb21tYW5kbyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSdzIE1pbGl0aWEgRm9yY2UiKSB+ICJQZW9wbGUncyBNaWxpdGlhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGhvZW5peCBEZWZlbnNlIEZvcmNlIikgfiAiUGhvZW5peCBEZWZlbnNlIEZvcmNlIiwgDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBob2VuaXggU3BlY2lhbCBHdWVycmlsbGEgRm9yY2UiKSB+ICJQaG9lbml4IFNwZWNpYWwgR3VlcnJpbGxhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUE5PL1BOQTogUGEtT2ggTmF0aW9uYWwgT3JnYW5pemF0aW9uL1BhLU9oIE5hdGlvbmFsIEFybXkiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiUE5PL1BOQTogUGEtT2ggTmF0aW9uYWwgT3JnYW5pemF0aW9uL1BhLU9oIE5hdGlvbmFsIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQcmlzb25lcnMgXFwoTXlhbm1hclxcKSIpIH4gIlByaXNvbmVycyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQU0xGL1ROTEE6IFBhbGF1bmcgU3RhdGUgTGliZXJhdGlvbiBGcm9udC9UYSdhbmcgTmF0aW9uYWwgTGliZXJhdGlvbiBBcm15IikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIlBTTEYvVE5MQTogUGFsYXVuZyBTdGF0ZSBMaWJlcmF0aW9uIEZyb250L1RhJ2FuZyBOYXRpb25hbCBMaWJlcmF0aW9uIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJSYWtoaW5lIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiUmFraGluZSBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUkNTUy9TU0EtUzogUmVzdG9yYXRpb24gQ291bmNpbCBvZiBTaGFuIFN0YXRlL1NoYW4gU3RhdGUgQXJteS1Tb3V0aCIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJSQ1NTL1NTQS1TOiBSZXN0b3JhdGlvbiBDb3VuY2lsIG9mIFNoYW4gU3RhdGUvU2hhbiBTdGF0ZSBBcm15LVNvdXRoIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUmVmdWdlZXMvSURQcyBcXChNeWFubWFyXFwpIikgfiAiUmVmdWdlZXMvSURQcyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJTaGFuIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiU2hhbiBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiU3R1ZGVudHMgXFwoTXlhbm1hclxcKSIpIH4gIlN0dWRlbnRzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlRlYWNoZXJzIFxcKE15YW5tYXJcXCkiKSB+ICJUZWFjaGVycyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJVTEEvQUE6IFVuaXRlZCBMZWFndWUgb2YgQXJha2FuL0FyYWthbiBBcm15IikgfiAiVUxBL0FBOiBVbml0ZWQgTGVhZ3VlIG9mIEFyYWthbi9BcmFrYW4gQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlVMRkEtSTogVW5pdGVkIExpYmVyYXRpb24gRnJvbnQgb2YgQXNvbS1JbmRlcGVuZGVudCIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJVTEZBLUk6IFVuaXRlZCBMaWJlcmF0aW9uIEZyb250IG9mIEFzb20tSW5kZXBlbmRlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJVcmJhbiBHdWVycmlsbGEgR3JvdXAiKSB+ICJVcmJhbiBHdWVycmlsbGEgR3JvdXAiLCANCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiVVNEUDogVW5pb24gU29saWRhcml0eSBhbmQgRGV2ZWxvcG1lbnQgUGFydHkiKSB+ICJVU0RQOiBVbmlvbiBTb2xpZGFyaXR5IGFuZCBEZXZlbG9wbWVudCBQYXJ0eSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlplcm8gR3VlcnJpbGxhIEZvcmNlIikgfiAiWmVybyBHdWVycmlsbGEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJETlA6IERlbW9jcmF0aWMgUGFydHkgb2YgTmF0aW9uYWwgUG9saXRpY3MiKSB+ICJETlA6IERlbW9jcmF0aWMgUGFydHkgb2YgTmF0aW9uYWwgUG9saXRpY3MiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJIbGF3IFRldCBJbiBBaHIgU3UgMTI2OiBSb3dpbmcgRm9yY2UgMTI2IikgfiAiSGxhdyBUZXQgSW4gQWhyIFN1IDEyNjogUm93aW5nIEZvcmNlIDEyNiIsDQogICAgICAgICAgICAgICAgICAgICBUUlVFIH4gYWN0b3Jfc2ltcGxlKSkgJT4lICANCiAgbXV0YXRlKGludGVyMSA9IHJlY29kZShpbnRlcjEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJzdGF0ZV9mb3JjZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJwb2xpdGljYWxfbWlsaXRpYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGA0YCA9ICJpZGVudGl0eV9taWxpdGlhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gInJpb3RlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGA2YCA9ICJwcm90ZXN0ZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgN2AgPSAiY2l2aWxpYW5zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYDhgID0gImV4dGVybmFsX290aGVyX2ZvcmNlIikpICU+JSAgDQogIG11dGF0ZShpbnRlcjEgPSBmY3RfcmVsZXZlbChpbnRlcjEsIGMoImV4dGVybmFsX290aGVyX2ZvcmNlIiwgImlkZW50aXR5X21pbGl0aWFzIiwgInJpb3RlcnMiLCAicmViZWxfZ3JvdXBzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvbGl0aWNhbF9taWxpdGlhcyIsICJzdGF0ZV9mb3JjZXMiLCAiY2l2aWxpYW5zIiwgInByb3Rlc3RlcnMiKSkpICU+JSANCiAgbXV0YXRlKGV2ZW50X3R5cGUgPSBmY3RfcmVsZXZlbChldmVudF90eXBlLCBjKCJCYXR0bGVzIiwgIkV4cGxvc2lvbnMvUmVtb3RlIHZpb2xlbmNlIiwgIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZXN0cyIsICJSaW90cyIsICJTdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIikpKSAlPiUgDQogIG11dGF0ZShoYXNfZmF0YWxpdGllcyA9IGlmZWxzZShmYXRhbGl0aWVzID4gMCwgVFJVRSwgRkFMU0UpKQ0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQpwY29kZTFfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsvbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUpICU+JSBzdF9hc19zZigpDQoNCiMgcmVhZGluZyBpbiB0b3duc2hpcHMgZnJvbSBnZW9hZG1pbnMgDQp0b3duc2hpcHMgPC0gcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsDQogICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdChhZG1pbjFwY29kZV80OmFkbWluM3Bjb2RlKSAlPiUgDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBhZG1pbjFwY29kZV80LA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gYWRtaW4zcGNvZGUsDQogICAgICAgICBzdGF0ZV9uYW1lICAgPSBzdGF0ZV81LA0KICAgICAgICAgdG93bnNoaXBfbmFtZSAgPSBjb3VudHkpICU+JSANCiAgcmVtb3ZlX2VtcHR5KCkgJT4lDQogIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGVfbmFtZSA9PSAiTWFnd2F5IiAmIHRvd25zaGlwX25hbWUgPT0gIk1pbmhsYSIsICJNTVIwMDkwMTMiLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0YXRlX25hbWUgPT0gIllhbmdvbiIgJiB0b3duc2hpcF9uYW1lID09ICJIdGFudGFiaW4iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSkNCg0KIyByZWFkaW5nIGluIDVXcw0KZnNjIDwtIHJlYWRfY3N2KCJmc2M1d18yMDIxLmNzdiIpDQoNCiMgYWNsZWRfd29yZHMgZGYNCmFjbGVkX3dvcmRzIDwtIGFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBzZWxlY3QoZGF0YV9pZCwgbm90ZXMpICU+JSANCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBub3RlcykgJT4lIA0KICBhbnRpX2pvaW4oc3RvcF93b3JkcywgYnkgPSAid29yZCIpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIikpICU+JSANCiAgbGVmdF9qb2luKGFjbGVkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGRhdGFfaWQsIGFkbWluMSwgYWRtaW4zX3Bjb2RlLCBldmVudF90eXBlLCBzdWJfZXZlbnRfdHlwZSwgZmF0YWxpdGllcywgaW50ZXJfdHlwZSksIGJ5ID0gImRhdGFfaWQiKQ0KDQoNCiMgcmVhZGluZyBpbiB2dWxuZXJhYmlsaXR5IGRhdGFzZXQNCnZ1bG1tciA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9zZWFueS9Eb2N1bWVudHMvUi9tbXJfNXdfaW5pdGlhbF9vYnNlcnZhdGlvbnMvRGF0YXNldHNfVnVsbmVyYWJpbGl0eV9BbmFseXNpc19pbl9NeWFubWFyXzA5SnVsMjAxOCAoMSkueGxzeCIsDQogICAgICAgICAgIHNraXAgPSAxKSAlPiUgDQogIHNsaWNlKC1jKDE6MykpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtbGFiZWwpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobnVtYmVyX29mX3ZpbGxhZ2VfdHJhY3RzOndiX3dlYWx0aF9yYW5rKSwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkaXNhc3RlcnNfaW1wYWN0ZWRfYnlfbmFyZ2lzXzIwMDg6YWNsZWRfMjAxNV8yMDE2X2RhdGFfZXhpc3RzKSwgYXMubG9naWNhbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjb25mbGljdF8yMDE1XzIwMTZfbnVtYmVyX29mX2JhdHRsZXM6Y29ycmVjdGVkX2NvbmZsaWN0X2luZGV4X2dhcnJ5KSwgYXMubnVtZXJpYykgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ4IikpICU+JSANCiAgc2VsZWN0KC1jKHByaXZhdGVfc2VjdG9yX2RldmVsb3BtZW50XzIwMTRfMjAxNSwgcHJvdGVjdGlvbl8yMDEwXzIwMTUsIHNoZWx0ZXJfMjAxMF8yMDE1LCB3YXNoXzIwMTBfMjAxNSkpDQoNCiMgc2hvd19jb2wodmlyaWRpc19wYWwoKSgxMCkpDQoNCmBgYA0KDQojIyAxLiBQcm9ncmVzc2lvbiBvZiBjb25mbGljdCBldmVudHMgYnkgaW50ZXJhY3Rpb24gdHlwZSBpbiAyMDIxDQoNClRoZSBHSUYgIGJlbG93IHNob3dzIDIwMjEgY29uZmxpY3QgZXZlbnRzIGJ5ICoqbW9udGgqKi4gVGhlIGNvbG91ciBvZiBlYWNoIHBvaW50IGluZGljYXRlcyB0aGUgaW50ZXJhY3Rpb24gdHlwZSwgd2hpY2ggY2xhc3NpZnkgY29uZmxpY3QgZXZlbnRzIGJhc2VkIG9uIHdoYXQgdHlwZSBvZiBhY3RvcnMgd2VyZSBpbnZvbHZlZC4gVGhlIDYgbW9zdCBjb21tb24gaW50ZXJhY3Rpb24gdHlwZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLCB3aXRoIGFsbCB0aGUgbGVzcyBmcmVxdWVudCBvbmVzIGJlaW5nIHJlY29kZWQgYXMgIm90aGVyIi4gVGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGV2ZW50IGluZGljYXRlZCBieSB0aGUgc2l6ZSBvZiBlYWNoIHBvaW50Lg0KDQpUaGUgdHlwZSBvZiBpbnRlcmFjdGlvbiB0aGF0IHJlc3VsdGVkIGluIHRoZSBtb3N0IGZhdGFsaXRpZXMgd2VyZSBiZXR3ZWVuIHRoZSBtaWxpdGFyeSBhbmQgcG9saXRpY2FsIG1pbGl0aWEgKDU3JSBvZiBmYXRhbGl0aWVzKSwgdGhlc2Ugd2VyZSBmb2xsb3dlZCBieSBtaWxpdGFyeSB2ZXJzdXMgcmViZWxzICgxOSUpLCB0aGVuIHRoZSBtaWxpdGFyeSB2ZXJzdXMgY2l2aWxpYW5zICg5JSkgYW5kIHBvbGl0aWNhbCBtaWxpdGlhIHZlcnN1cyBjaXZpbGlhbnMgKDglKS4gQW4gYWx0ZXJuYXRpdmUgR0lGLCBzaG93aW5nIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgY29uZmxpY3QgaW4gMjAyMSBieSBldmVudCB0eXBlIGlzIHNob3duIGluIHNlY3Rpb24gMy41LiANCg0KPGJyPg0KIVtdKGFjbGVkNC5naWYpDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMi4gRGlzdHJpYnV0aW9uIG9mIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgYW5kIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxIA0KDQpUaGVyZSBpcywgaW4gZ2VuZXJhbCwgYSBkZWFydGggb2YgcGFydG5lcnMgaW4gdGhlIHBhcnRzIG9mIHRoZSBjb3VudHJ5IG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QsIGVzcGVjaWFsbHkgYXJvdW5kIFNhZ2FpbmcgYW5kIE1hZ3dheS4gQmF0dGxlcyBhbmQgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIHdlcmUgbW9zdCBwcmV2YWxlbnQgaW4gU2FnYWluZywgYW5kLCB0byBsZXNzZXIgZXh0ZW50cyBLYWNoaW4gYW5kIFNoYW4gTm9ydGguIFRoaXMgcHJlc2VudHMgYSB2ZXJ5IGNsZWFyIHBpY3R1cmUgdGhhdCBodW1hbml0YXJpYW4gcGFydG5lcnMsIHdobyBoYXZlIHRyYWRpdGlvbmFsbHkgZm9jdXNlZCBvbiBSYWtoaW5lLCBLYWNoaW4gYW5kIG5vcnRoZXJuIFNoYW4gaGF2ZSBub3QgYWxsb2NhdGVkIHRoZWlyIHJlc291cmNlcyBpbiBsaW5lIHdpdGggcG9wdWxhdGlvbnMgYWZmZWN0ZWQgYnkgY29uZmxpY3QuIFRob3VnaCB0aGUgZXh0ZW50IHRvIHdoaWNoIHN1Y2ggZGVjaXNpb25zIHdlcmUgaW5mbHVlbmNlZCBieSBPQ0hBJ3MgZm9jdXMgb24gcGVyaS11cmJhbiBhcmVhcyBpbiB0aGUgSUVSUCBpcyB1bmNsZWFyLiANCg0KPGJyPg0KDQpgYGB7ciBtYXAtZXZlbnRzLWZzYy1wYXJudGVycywgZmlnLmhlaWdodD0xMH0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSAmIHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lDQogIGZ1bGxfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluMV9wY29kZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gcGFydG5lcnMpLCBzaXplID0gMC4xKSArIA0KICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUpLCBzaXplID0gMC41LCBhbHBoYSA9IDAuNCwgY29sb3VyID0gInJlZCIpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBhbHBoYSA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgYnJlYWtzID0gYygxLCAzLCA2LCA5LCAxMikpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgYW5kIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxIiwNCiAgICAgICBzdWJ0aXRsZSA9ICAiUmVkIGRvdHMgYXJlIGNvbmZsaWN0IGV2ZW50czsgcGVhY2VmdWwgcHJvdGVzdHMgaGF2ZSBiZWVuIGV4Y2x1ZGVkIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSBhbmQgRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5wYXJ0bmVycyIpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCiANCiA8YnI+PGJyPjxicj4NCg0KDQojIyAzLiBQcm9ncmVzc2lvbiBhbmQgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcw0KDQojIyMgMy4xIEFubnVhbCBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IGV2ZW50IHR5cGUNCg0KVGhlIHBsb3QgYmVsb3cgc2hvd3MgYSBtYXNzaXZlIHNwaWtlIGluIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxLCBiZWFyaW5nIGluIG1pbmQgdGhhdCBNeWFubWFyIGhhcyBsb25nIGJlZW4gZW1icm9pbGVkIGluIGEgNzAteWVhciBjaXZpbCB3YXIuIFByZXZpb3VzbHksIHdoZW4gdGhlIFtNSU1VLUhBUlAgVnVsbmVyYWJpbGl0eSBJbmRleF0oaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIpIHdhcyBkZXZlbG9wZWQgaW4gMjAxNiwgY2xpbWF0ZSByaXNrLCB1bmRlcmRldmVsb3BtZW50IGFuZCBjb25mbGljdCByaXNrIHdlcmUgYWxsIHRha2VuIGludG8gYWNjb3VudCBpbiB0aGUgaW5kZXggd2l0aCBlcXVhbCB3ZWlnaHRpbmcuIEhvd2V2ZXIsIGdpdmVuIHRoZSBtYXNzaXZlIGluY3JlYXNlIGluIGNvbmZsaWN0IGV2ZW50cywgY29uZmxpY3QgaW5kaWNhdG9ycyBzaG91bGQgYmUgYWZmb3JkZWQgbXVjaCBncmVhdGVyIHdlaWdodHMgaW4gYW55IGNvbnNpZGVyYXRpb24gb2YgdnVsbmVyYWJpbGl0eSBhbmQgdGhlIHJlb3JpZW50YXRpb24gb2YgYWN0aXZpdGllcyBhcm91bmQgY29uZmxpY3QgbG9jaSBpcyB2ZXJ5IG11Y2ggd2FycmFudGVkLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXllYXItZXZlbnRzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV2ZW50X3R5cGUpICYgeWVhciA8IDIwMjIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHJvdW5kKHllYXIpKSAlPiUgDQogIGdyb3VwX2J5KHllYXIsIGV2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIGNvdW50LCBmaWxsID0gZXZlbnRfdHlwZSwgZ3JvdXAgPSBldmVudF90eXBlKSkgKyANCiAgIyBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSB5ZWFyKSwgc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gc3VtLCB2anVzdCA9IC0wLjcsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAxMCwgMjAyMSwgYnkgPSAxKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBsaW1pdHMgPSBjKDAsIDE3MDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGJ5IGV2ZW50IHR5cGUsIDIwMTAtMjAyMSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQpgYGANCg0KPGJyPg0KDQoNClRoZSAyMDIxIGJyZWFrZG93biBvZiBjb25mbGljdCBldmVudHMgaW4gMjAyMSB3YXM6DQoNCmBgYHtyIGNvbmZsaWN0LWV2ZW50cy1zdW1tYXJ5LTIwMjF9DQphY2xlZCAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50YWdlID0gcm91bmQoY291bnQgLyBzdW0oY291bnQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGVyY2VudGFnZSkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxIGV2ZW50IHR5cGVzIGJ5IHBlcmNlbnRhZ2Ugb2YgdG90YWwiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAibGVmdCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQpUaGVyZSB3ZXJlIG1vcmUgY29uZmxpY3QgZmF0YWxpdGllcyBpbiAyMDIxIHRoYW4gZnJvbSAyMDEwIHRvIDIwMjAgY29tYmluZWQuIEhvd2V2ZXIsIHJlYWN0aW9ucyB0byB0aGVzZSBjaGFuZ2VzIGluIGNvbnRleHQgaGF2ZSBiZWVuIHNsb3cgLS0gd2VyZSBhIGN5Y2xvbmUgdG8gaGF2ZSBjYXVzZWQgbW9yZSBmYXRhbGl0aWVzIHRoYW4gYWxsIGV4dHJlbWUgd2VhdGhlciBldmVudHMgZm9yIHRoZSBwcmV2aW91cyB0ZW4geWVhcnMsIG9uZSBtaWdodCBoYXZlIGV4cGVjdGVkIG1vcmUgdXJnZW5jeSBhbmQgZHJhc3RpYyByZWFsbG9jYXRpb24gb2YgcmVzb3VyY2VzLiANCg0KVGhlcmUgd2VyZSBtb3JlIGZhdGFsaXRpZXMgcmVsYXRlZCB0byB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyBhbG9uZSB0aGFuIGFsbCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgaW4gMjAxOSwgd2hpY2ggcHJldmlvdXNseSBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGZhdGFsaXRpZXMgdGhpcyBkZWNhZGUuDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC15ZWFyLWZhdGFsdGllc30NCmFjbGVkICU+JSANCiAgZmlsdGVyKCFpcy5uYShldmVudF90eXBlKSAmIHllYXIgPCAyMDIyKSAlPiUNCiAgbXV0YXRlKHllYXIgPSByb3VuZCh5ZWFyKSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIGZhdGFsaXRpZXMsIGZpbGwgPSBldmVudF90eXBlLCBncm91cCA9IGV2ZW50X3R5cGUpKSArIA0KICAjIGdlb21fbGluZShzaXplID0gMSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShzdGF0KHkpLCBhY2N1cmFjeSA9IDEpLCBncm91cCA9IHllYXIpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNywgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDEwLCAyMDIxLCBieSA9IDEpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGxpbWl0cyA9IGMoMCwgMTI1MDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJGYXRhbGl0aWVzIGJ5IGNvbmZsaWN0IGV2ZW50IHR5cGUsIDIwMTAtMjAyMSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgUHJvZ3Jlc3Npb24gb2YgY29uZmxpY3QgZXZlbnRzIGluIDIwMjENCg0KQmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIHJvc2Ugc3RlYWRpbHkgdW50aWwgTWF5IDIwMjEsIHRoZW4gZXhwZXJpZW5jZWQgYSBicmllZiBkZWNsaW5lIGJlZm9yZSByaXNpbmcgYWdhaW4gaW4gU2VwdGVtYmVyIDIwMjEuIFByb3Rlc3RzIGFuZCByaW90cyBwZWFrZWQgaW4gTWFyY2ggMjAyMSwgcmlnaHQgYWZ0ZXIgdGhlIGNvdXAuIEV2ZW50cyBpbnZvbHZpbmcgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgZ3JldyBpbiBmcmVxdWVuY3kgdGhyb3VnaG91dCB0aGUgeWVhciwgdGhvdWdoIGEgc2xpZ2h0IGRlY2xpbmUgaW4gaW50ZW5zaXR5IHdhcyBub3RlZCBhdCB0aGUgZW5kIG9mIHRoZSB5ZWFyLiANCg0KPGJyPg0KDQpgYGB7ciBmYWNldC1saW5lLXBsb3QtbW9udGhseX0NCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkobW9udGgsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUNCiAjICBtdXRhdGUobW9udGggPSBmY3RfcmV2KG1vbnRoKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGNvdW50LCBncm91cCA9IGV2ZW50X3R5cGUsIGNvbG91ciA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgZmFjZXRfd3JhcCh+ZXZlbnRfdHlwZSwgc2NhbGVzID0gImZyZWVfeSIpICsgDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBwZXIgbW9udGgsIGJ5IHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpDQoNCiMgY3VtdWxhdGl2ZSBjb3VudHMgcmVzdWx0cyBpbiBhIGxlc3MgaW50ZXJlc3RpbmcgZ3JhcGggDQojIGFjbGVkICU+JSAgDQojICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KIyAgIG11dGF0ZShtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgoZXZlbnRfZGF0ZSwgbGFiZWwgPSBUUlVFKSkgJT4lDQojICAgZ3JvdXBfYnkobW9udGgsIGV2ZW50X3R5cGUpICU+JSANCiMgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiMgICB1bmdyb3VwKCkgJT4lIA0KIyAgIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiMgICBtdXRhdGUoY3VtX2NvdW50ID0gY3Vtc3VtKGNvdW50KSkgJT4lIA0KIyAgIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gY3VtX2NvdW50LCBncm91cCA9IGV2ZW50X3R5cGUsIGNvbG91ciA9IGV2ZW50X3R5cGUpKSArIA0KIyAgIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsNCiMgICBmYWNldF93cmFwKH5ldmVudF90eXBlLCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiMgICBsYWJzKHggPSAiIiwNCiMgICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyIsIA0KIyAgICAgICAgdGl0bGUgPSAiUHJvZ3Jlc3Npb24gb2YgMjAyMSBjb25mbGljdCBldmVudHMsIGJ5IHR5cGUiLA0KIyAgICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKSArIA0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQo8YnI+DQoNCkl0IGlzIGN1cnJlbnRseSB1bmtub3duIHdoYXQgY2F1c2VkIHRoZSByZWxhdGl2ZSBkaXAgaW4gdGhlIGludGVuc2l0eSBvZiBjb25mbGljdCBldmVudHMgaW4gSnVuZSBhbmQgSnVseSwgdGhvdWdoIGl0IGlzIGN1cnJlbnRseSBoeXBvdGhlc2lzZWQgdGhlIHZlcnkgaGVhdnkgZmlnaHRpbmcgaW4gTWF5IG1pZ2h0IGhhdmUgbGVkIHRvIGEgbHVsbCBpbiBhY3Rpdml0eSB3aGVyZSBhY3RvcnMgcmVncm91cCBhbmQgcmV0aGluayB0aGVpciBzdHJhdGVnaWVzIC0tIHRoZSBQZW9wbGUncyBEZWZlbmNlIEZvcmNlIHdhcyBmb3JtZWQgaW4gTWF5IDIwMjEuIFRoZSBzcGlrZSBpbiBhcnJlc3RzIGluIE1heSBtaWdodCBhbHNvIGhhdmUgY29udHJpYnV0ZWQgYXMgbWFzcyBhcnJlc3RzIG1pZ2h0IGhhdmUgZGltaW5pc2hlZCB0aGUgY2FwYWNpdGllcyBvZiBjZXJ0YWluIGFjdG9ycyB0byBlbmdhZ2UgaW4gY29uZmxpY3QgZXZlbnRzLiBPciwgdGhpcyByZWxhdGl2ZSBkaXAgaW4gY29uZmxpY3QgYWxzbyBjb2luY2lkZXMgd2l0aCB0aGUgc293aW5nIHBlcmlvZHMgZm9yIHBhZGR5LiBBcyBhIG5vdGUsIHRoZSBzdWItZXZlbnQgdHlwZSAiQXR0YWNrIiBpcyB0aGUgbW9zdCBjb21tb24gY2F0ZWdvcnkgb2YgdGhlICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIgZXZlbnQgdHlwZS4gDQoNCjxicj4NCg0KYGBge3IgbGluZS1wbG90LXN1Yi1ldmVudC10eXBlLTIwMjEsIGZpZy5oZWlnaHQ9NX0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBmaWx0ZXIoc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIG11dGF0ZShzdWJfZXZlbnRfdHlwZSA9IGZjdF9sdW1wKHN1Yl9ldmVudF90eXBlLCA4KSkgJT4lIA0KICBncm91cF9ieShtb250aCwgc3ViX2V2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBjb3VudCwgY29sb3VyID0gc3ViX2V2ZW50X3R5cGUsIGdyb3VwID0gc3ViX2V2ZW50X3R5cGUpKSArDQogIGdlb21fbGluZShzaXplID0gMC43KSArIA0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAidHVyYm8iKSArIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMiLCANCiAgICAgICB0aXRsZSA9ICIyMDIxIGNvbmZsaWN0IGV2ZW50cyBieSBzdWItZXZlbnQgdHlwZSAocGVhY2VmdWwgcHJvdGVzdHMgZXhjbHVkZWQpIiwgDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgIGNvbG91ciA9ICIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDMuMyBDb25mbGljdCBmYXRhbGl0aWVzIGluIDIwMjENCg0KQmF0dGxlcyBhbmQgZXhwbG9zaW9ucy9yZW1vdGUgdmlvbGVuY2Ugd2VyZSB0aGUgbGFyZ2VzdCBjb250cmlidXRvcnMgdG8gY29uZmxpY3QgZmF0YWxpdGllcyBpbiAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3QtZmF0YWxpdGllcywgZmlnLmhlaWdodD02fQ0KIA0KYWNsZWQgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gZmxvb3JfZGF0ZShldmVudF9kYXRlLCAibW9udGgiKSkgJT4lIA0KICBtdXRhdGUobW9udGggPSBtYXAobW9udGgsIH4gc2VxLkRhdGUoYXMuRGF0ZSguKSwgYXMuRGF0ZSgiMjAyMS8xMi8wMSIpLCBieSA9ICJtb250aCIpKSkgJT4lIA0KICB1bm5lc3QobW9udGgpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbHVicmlkYXRlOjptb250aChtb250aCwgbGFiZWwgPSBUUlVFKSkgJT4lIA0KICAjIG11dGF0ZShtb250aCA9IGZvcm1hdF9JU084NjAxKG1vbnRoLCBwcmVjaXNpb24gPSAieW0iKSkgJT4lDQogIGdyb3VwX2J5KG1vbnRoLCBldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGZhdGFsaXRpZXMsIGdyb3VwID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2FyZWEoKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTIwMDAsIGJ5ID0gMTAwMCksIGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGxhYnMoeCA9ICIiLA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBmYXRhbGl0aWVzIiwgDQogICAgICAgdGl0bGUgPSAiQ3VtdWxhdGl2ZSAyMDIxIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBwZXIgbW9udGgsIGJ5IGV2ZW50IHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgDQogICAgICAgZmlsbCA9ICIiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCldvcnJ5aW5nbHksIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGZvcm1lZCAxNSUgb2YgYWxsIGNvbmZsaWN0IGZhdGFsaXRpZXM6DQoNCmBgYHtyIGZhdGFsaXRpZXMtc3VtbWFyeS0yMDIxfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50YWdlID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHBlcmNlbnRhZ2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMSBjb25mbGljdCBmYXRhbGl0aWVzIGJ5IGV2ZW50IHR5cGUiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAibGVmdCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPiANCg0KSG93ZXZlciwgdGhlIGV2ZW50IHR5cGUgIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIiBkb2VzIG5vdCBlbmNvbXBhc3MgYWxsIGZhdGFsIGluY2lkZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMuIE9uY2UgdGhlIGRhdGEgaXMgZXhhbWluZWQgdGhyb3VnaCB0aGUgbGVucyBvZiBpbnRlcmFjdGlvbiB0eXBlLCB3aGljaCByZWNvcmRzIHRoZSB0eXBlcyBvZiBhY3RvcnMgaW52b2x2ZWQgaW4gZWFjaCBjb25mbGljdCBldmVudCwgaXQgc2hvdWxkIGJlIA0KDQpJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBgciByb3VuZCgoZmlsdGVyKGFjbGVkLCB5ZWFyID09IDIwMjEgJiBzdHJfZGV0ZWN0KGludGVyX3R5cGUsICJjaXZpbGlhbnxwcm90ZXN0ZXIiKSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX0pIC8gKGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgZmF0YWxpdGllcyBzdGVtIGZyb20gaW50ZXJhY3Rpb25zIGludm9sdmluZyBub24tY29tYmF0YW50cyAtLSB0aGF0IGlzLCBjaXZpbGlhbnMgYW5kIHByb3Rlc3RlcnMuIFRoZSBuZXh0IGNoYXB0ZXIgZGVhbHMgd2l0aCBhIG1vcmUgZGV0YWlsZWQgY2FsY3VsYXRpb24gZm9yIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyByZWxhdGVkIHRvIG5vbi1jb21iYXRhbnRzLiANCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3QtaW50ZXItdHlwZS0yMDIxLCBmaWcuaGVpZ2h0PTZ9DQoNCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGZsb29yX2RhdGUoZXZlbnRfZGF0ZSwgIm1vbnRoIikpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbWFwKG1vbnRoLCB+IHNlcS5EYXRlKGFzLkRhdGUoLiksIGFzLkRhdGUoIjIwMjEvMTIvMDEiKSwgYnkgPSAibW9udGgiKSkpICU+JSANCiAgdW5uZXN0KG1vbnRoKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgobW9udGgsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKGludGVyX3R5cGUgIT0gInNvbGUgcHJvdGVzdGVyIGFjdGlvbiIpICU+JSANCiAgbXV0YXRlKGludGVyX3R5cGUgPSBmY3RfbHVtcChpbnRlcl90eXBlLCA2KSkgJT4lIA0KICBncm91cF9ieShtb250aCwgaW50ZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGZhdGFsaXRpZXMsIGdyb3VwID0gaW50ZXJfdHlwZSwgZmlsbCA9IGludGVyX3R5cGUpKSArIA0KICBnZW9tX2FyZWEoKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTIwMDAsIGJ5ID0gMTAwMCksIGxhYmVscyA9IGNvbW1hKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOTVGMDIiLCAiIzc1NzBCMyIsICIjMUI5RTc3IiwgIiNFNzI5OEEiLCAiIzY2QTYxRSIsICIjRTZBQjAyIiwgIiM2NjY2NjYiLCAiI0E2NzYxRCIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBmYXRhbGl0aWVzIiwgDQogICAgICAgdGl0bGUgPSAiQ3VtdWxhdGl2ZSBmYXRhbGl0aWVzIGluIDIwMjEgYnkgaW50ZXJhY3Rpb24gdHlwZSwgZXhjbHVkaW5nIHNvbGUgcHJvdGVzdGVyIGFjdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBmaWxsID0gIiIpICAgDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBsYXJnZXN0IG51bWJlcnMgb2YgZmF0YWxpdGllcyBhcmUgcmVsYXRlZCB0byBldmVudHMgaW52b2x2aW5nIHRoZSBtaWxpdGFyeSwgcG9saXRpY2FsIG1pbGl0aWFzIChpbmNsdWRpbmcgdGhlIFBlb3BsZSdzIERlZmVuc2UgRm9yY2UpIGFuZCByZWJlbCBncm91cHM6IA0KDQpgYGB7ciBmYXRhbGl0aWVzLXN1bW1hcnktMjAyMS1pbnRlci10eXBlfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lDQogIGZpbHRlcihpbnRlcl90eXBlICE9ICJzb2xlIHByb3Rlc3RlciBhY3Rpb24iKSAlPiUgDQogIG11dGF0ZShpbnRlcl90eXBlID0gZmN0X2x1bXAoaW50ZXJfdHlwZSwgNikpICU+JSANCiAgZ3JvdXBfYnkoaW50ZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwZXJjZW50YWdlKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjEgY29uZmxpY3QgZmF0YWxpdGllcyBieSBpbnRlcmFjdGlvbiB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgR2VvZ3JhcGhpYyBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGluIDIwMjENCg0KPGJyPiANCg0KYGBge3Igc3RhdGUtZXZlbnRzLXBsb3R9DQoNCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogIG11dGF0ZShzdW0gPSBzdW0oY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShhZG1pbjEgPSBmY3RfcmVvcmRlcihhZG1pbjEsIHN1bSwgLmRlc2MgPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhZG1pbjEsIHkgPSBjb3VudCwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHN0YXQoeSksIGFjY3VyYWN5ID0gMSksIGdyb3VwID0gYWRtaW4xKSwgc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gc3VtLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDM4MDAsIGJ5ID0gMTAwMCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGhqdXN0ID0gMSwgYW5nbGUgPSA2MCksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdCBldmVudHMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpTYWdhaW5nIHNhdyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIGFzIHdlbGwgYXMgZmF0YWxpdGllcyBpbiAyMDIxLCBpbiBwYXJ0aWN1bGFyLCBpdCBleHBlcmllbmNlZCBtb3JlIHRoYW4gdGhyZWUgdGltZXMgYXMgbWFueSBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgdGhhbiB0aGUgbmV4dCBoaWdoZXN0IHJlZ2lvbiwgTWFnd2F5LiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgc2hpZnQgaW4gdGhlIHBhdHRlcm4gb2YgY29uZmxpY3QgaW4gTXlhbm1hciwgd2hpY2ggaGFzIHRyYWRpdGlvbmFsbHkgcmV2b2x2ZWQgYXJvdW5kIEthY2hpbiwgUmFraGluZSBhbmQgU2hhbi4gDQoNCjxicj4NCg0KYGBge3Igc3RhdGUtZmF0YWxpdGllcy1wbG90fQ0KDQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShzdW0gPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGFkbWluMSA9IGZjdF9yZW9yZGVyKGFkbWluMSwgc3VtLCAuZGVzYyA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFkbWluMSwgeSA9IGZhdGFsaXRpZXMsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShzdGF0KHkpLCBhY2N1cmFjeSA9IDEpLCBncm91cCA9IGFkbWluMSksIHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9IHN1bSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCA1MDAwLCBieSA9IDEwMDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBoanVzdCA9IDEsIGFuZ2xlID0gNjApLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICIyMDIxIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBieSBzdGF0ZS9yZWdpb24iLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCiANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy41IFByb2dyZXNzaW9uIG9mIHRoZSBjb25mbGljdCBpbiAyMDIxIGJ5IGV2ZW50IHR5cGUNCg0KVGhlIEdJRiAgYmVsb3cgc2hvd3MgMjAyMSBjb25mbGljdCBldmVudHMgYnkgKiptb250aCoqLiBUaGUgY29sb3VyIG9mIGVhY2ggcG9pbnQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbmZsaWN0IGV2ZW50LiBUaGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZXZlbnQgaXMgaW5kaWNhdGVkIGJ5IHRoZSBzaXplIG9mIGVhY2ggcG9pbnQuIEl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBhZnRlciB0aGUgcHJvdGVzdHMgaW4gRmVicnVhcnkgYW5kIE1hcmNoIDIwMjEsIHRoZSBjb25mbGljdCBtb3ZlcyBvbiB0byBhIG5ldyBzdGFnZSBpbiBBcHJpbCBhbmQgTWF5LCB2aXNpYmx5IGluY3JlYXNpbmcgaW4gaW50ZW5zaXR5LiANCg0KPGJyPg0KIVtdKGV2ZW50X3R5cGUuZ2lmKQ0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNC4gTm9uLWNvbWJhdGFudHMgDQoNCiMjIyA0LjEgQ29uZmxpY3QgZXZlbnRzIGludm9sdmluZyBub24tY29tYmF0YW50cw0KDQo8YnI+DQoNCkl0IGlzIGVzdGltYXRlZCB0aGF0IGByIHJvdW5kKGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxICYgbm9uX2NvbWJhdGFudCA9PSBUUlVFKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSAvIChmaWx0ZXIoYWNsZWQsIHllYXIgPT0gMjAyMSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSBgciBmaWx0ZXIoYWNsZWQsIHllYXIgPT0gMjAyMSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBpbnZvbHZlZCBub24tY29tYmF0YW50cy4gDQoNCkluIHRoaXMgY2hhcHRlciwgdGhlIEFDTEVEIGRhdGFzZXQgaGFzIGJlZW4gZmlsdGVyZWQgZG93biB0byBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzOiB0aGUgZmlsdGVyIGFwcGxpZWQgc2VsZWN0ZWQgZXZlbnRzIHVuZGVyIHRoZSAqKmBldmVudF90eXBlYCoqICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIsIGNvbmZsaWN0IGludGVyYWN0aW9ucyBpbnZvbHZpbmcgY2l2aWxpYW5zIG9yIHByb3Rlc3RlcnMgYW5kIGFueSBldmVudHMgd2l0aCB0aGUgd29yZCAiY2l2aWxpYW4iLCAicHJvdGVzdGVyIiBvciAidmlsbGFnZXIiIGluIHRoZWlyIGRlc2NyaXB0aW9uLiBQZWFjZWZ1bCBwcm90ZXN0cyB3ZXJlIGZpbHRlcmVkIG91dCBhcyB0aGVzZSB3ZXJlIGxhcmdlbHkgb25lLXNpZGVkIGV2ZW50cyAod2hlcmUgdGhlIG9ubHkgYWN0b3JzIHdlcmUgcHJvdGVzdGVycykgYW5kIGRpZCBub3QgcmVzdWx0IGluIHByb3BlcnR5IGRhbWFnZSBvciBjYXN1YWx0aWVzLiBUaGVzZSBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGhhdmUgYmVlbiBwbG90dGVkIGluIHRoZSBtYXAgYmVsb3c6IGNvbmZsaWN0IGV2ZW50cyB3aXRoIGZhdGFsaXRpZXMgYXJlIGNvbG91cmVkIHJlZC4gDQoNCg0KYGBge3IgbWFwLW5vbi1jb21iYXRhbnRzLCBmaWcuaGVpZ2h0PTEwfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShoYXNfZmF0YWxpdGllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBhbHBoYSA9IDAsIGRhdGEgPSBwY29kZTNfc2hhcGUpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGZhdGFsaXRpZXMsIGNvbG91ciA9IGhhc19mYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBhbHBoYSA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCA0KSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIHN1YnRpdGxlID0gICJDaXZpbGlhbnMgYW5kIHByb3Rlc3RlcnMgYXJlIGNvbnNpZGVyZWQgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2VzOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIGFuZCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIsDQogICAgICAgZmlsbCA9ICJudW1iZXIgb2ZcbnBhcnRuZXJzIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhPTEpKSkNCmBgYA0KDQo8YnI+DQoNClRoZSBzcGVjaWZpYyBicmVha2Rvd24gb2Ygc3ViLWV2ZW50IHR5cGVzIGludm9sdmluZyBub24tY29tYmF0YW50cyB3ZXJlOiANCg0KDQpgYGB7ciB0YWJsZS1zdWItZXZlbnQtbm9uLWNvbWJhdGFudHN9DQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZmlsdGVyKG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIA0KICBncm91cF9ieShzdWJfZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgbXV0YXRlKHNvcnQgPSBldmVudHMgLyBzdW0oZXZlbnRzKSArIGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgbXV0YXRlKHN1Yl9ldmVudF90eXBlID0gaWZlbHNlKHNvcnQgPCAwLjAxNywgIk90aGVyIiwgc3ViX2V2ZW50X3R5cGUpKSAlPiUgDQogIGdyb3VwX2J5KHN1Yl9ldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBzdW0oZXZlbnRzKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIDEwIHN1Yi1ldmVudCB0eXBlcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgaW4gMjAyMSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgcG9zaXRpb24gPSAibGVmdCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBFdmVudHMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGJ5IHN0YXRlDQoNCg0KYGBge3IgYmFycGxvdC1ldmVudHMtZmF0YWxpdGllcy1zcn0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSAmIHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICBmaWx0ZXIobm9uX2NvbWJhdGFudCA9PSBUUlVFKSAlPiUNCiAgZ3JvdXBfYnkoYWRtaW4xKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksIA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lDQogIG11dGF0ZShhZG1pbjEgPSBmY3RfcmVvcmRlcihhZG1pbjEsIC1mYXRhbGl0aWVzKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmF0YWxpdGllcywgZXZlbnRzKSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBmY3RfcmVsZXZlbCh0eXBlLCBjKCJmYXRhbGl0aWVzIiwgImV2ZW50cyIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhZG1pbjEsIHkgPSB2YWx1ZSwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHZhbHVlKSwgc2l6ZSA9IDIuNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHZqdXN0ID0gLTAuMykgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdCA9IDAuNiksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgLyBldmVudHMiLA0KICAgICAgIHRpdGxlID0gIjIwMjEgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBieSBzdGF0ZSAoZXhjbC4gcGVhY2VmdWwgcHJvdGVzdHMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZXM6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBmaWxsID0gIiIpDQoNCmBgYA0KPGJyPg0KDQpUaGUgcGxvdCBhYm92ZSBzaG93cyB0aGUgYnJlYWtkb3duIG9mIGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYnkgc3RhdGUgYW5kIHJlZ2lvbi4gVGhlIGhpZ2ggbnVtYmVycyBvZiBldmVudHMgaW4gU2FnYWluZywgTWFuZGFsYXkgYW5kIFlhbmdvbiBhcmUgZHVlIHRvIGhpZ2ggaW5jaWRlbmNlcyBvZiBhcnJlc3RzIGFuZCBhdHRhY2tzIG9uIGNpdmlsaWFucy4gSG93ZXZlciwgdGhlIHJhdGlvIG9mIGF0dGFja3MgdnMuIGFycmVzdHMgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgaW4gU2FnYWluZyB0aGFuIHRob3NlIG90aGVyIHR3byByZWdpb25zOg0KDQpgYGB7ciB0YWJsZS1zdWItZXZlbnRzLXNyfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JQ0KICBtdXRhdGUoc3ViX2V2ZW50X3R5cGUgPSBmY3RfbHVtcChzdWJfZXZlbnRfdHlwZSwgNSkpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBzdWJfZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksIA0KICAgICAgICAgICAgRmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc3ViX2V2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gZXZlbnRzKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSkgJT4lIA0KICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkpICU+JQ0KICBtdXRhdGUoYWRtaW4xID0gcmVjb2RlKGFkbWluMSwgIk5heSBQeWkgVGF3IiA9ICJOYXlweWl0YXciKSkgJT4lDQogIHJlbmFtZShzdGF0ZSA9IGFkbWluMSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoRmF0YWxpdGllcykpICU+JSANCiAgcmVsb2NhdGUoRmF0YWxpdGllcywgLmFmdGVyID0gT3RoZXIpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJNYWluIHN1Yi1ldmVudCB0eXBlcyBhbmQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQogIA0KICANCmBgYA0KDQoNCjxicj4NCg0KS2FsZSBpbiBTYWdhaW5nIHNhdyB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBmYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBpbiAyMDIxIC0tIDclIG9mIG5vbi1jb21iYXRhbnQtcmVsYXRlZCBmYXRhbGl0aWVzIG9jY3VycmVkIHRoZXJlLCBvciBgciBmaWx0ZXIoYWNsZWQsIHllYXIgPT0gMjAyMSAmIGFkbWluM19wY29kZSA9PSAiTU1SMDA1MDI3IiAmIG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIHBlcnNvbnMuIGByIGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxICYgZmF0YWxpdGllcyA+IDAgJiBub25fY29tYmF0YW50ID09IFRSVUUpICU+JSBkaXN0aW5jdChhZG1pbjNfcGNvZGUpICU+JSBucm93KClgIHRvd25zaGlwcyByZXBvcnRlZCBmYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBpbiAyMDIwMS4gT2YgdGhlIHRvcCAyMCB0b3duc2hpcHMgaW4gdGVybXMgb2YgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMsIDExIG9mIHRoZW0gd2VyZSBpbiBTYWdhaW5nOiANCg0KPGJyPg0KDQpgYGB7ciBtYXAtdG93bnNoaXBzLWZhdGFsaXRpZXMtbm9uY29tYmF0YW50LCBmaWcuaGVpZ2h0PTEwfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBhZG1pbjMsIGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHBjX2V2ZW50cyA9IGV2ZW50cyAvIHN1bShldmVudHMpLCANCiAgICAgICAgIHBjX2ZhdGFsaXRpZXMgPSBmYXRhbGl0aWVzIC8gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwY19mYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGNfZmF0YWxpdGllcyA9IG5hX2lmKHBjX2ZhdGFsaXRpZXMsIDApLCANCiAgICAgICAgIGZhdGFsaXRpZXMgPSBuYV9pZihmYXRhbGl0aWVzLCAwKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gZmF0YWxpdGllcyksIHNpemUgPSAwLjEpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJGYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gImZhdGFsaXRpZXMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKQ0KDQoNCiAgDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA1LiBDb25mbGljdCBhY3RvcnMNCg0KIyMjIDUuMSBDb25mbGljdCBldmVudHMgYnkgdHlwZSBvZiBhY3RvciANCg0KVGhlIG5leHQgdHdvIHNlY3Rpb25zIHN1bW1hcmlzZSBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgZXZlbnQgdHlwZSBhbmQgYWN0b3IgdHlwZS4gRm9yIHRoZSBwbG90cyBiZWxvdywgb25lIHNob3VsZCBiZWFyIGluIG1pbmQgdGhhdCBtb3N0IGV2ZW50IHR5cGVzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgcGVhY2VmdWwgcHJvdGVzdHMpIGludm9sdmVkIG1vcmUgdGhhbiBvbmUgYWN0b3IsIHNvIHRvdGFsbGluZyB1cCBlYWNoIGZhY2V0IHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIGhpZ2hlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZXZlbnRzLiBGb3IgaW5zdGFuY2UsIHRoZSBzYW1lIGJhdHRsZSBpbnZvbHZpbmcgc3RhdGUgZm9yY2VzIGFuZCByZWJlbCBncm91cHMgd291bGQgc2hvdyB1cCBpbiB0aGUgZXZlbnQgY291bnRzIG9mIGVhY2guICANCg0KPGJyPg0KDQpgYGB7ciBhY3Rvci1mYWNldC1ldmVudC1jb3VudCwgZmlnLmhlaWdodCA9IDd9DQoNCmFjdG9ycyAlPiUNCiAgbXV0YXRlKGV2ZW50X3R5cGUgPSBmY3RfcmVsZXZlbChldmVudF90eXBlLCBjKCJCYXR0bGVzIiwgIkV4cGxvc2lvbnMvUmVtb3RlIHZpb2xlbmNlIiwgIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZXN0cyIsICJSaW90cyIsICJTdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIikpKSAlPiUgDQogIG11dGF0ZShpbnRlcjEgPSBmY3RfcmVsZXZlbChpbnRlcjEsIGMoInN0YXRlX2ZvcmNlcyIsICJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJwb2xpdGljYWxfbWlsaXRpYXMiLCAicmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlvdGVycyIsICJpZGVudGl0eV9taWxpdGlhcyIsICJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFjdG9yX3NpbXBsZSwgZXZlbnRfdHlwZSwgaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwNCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfdHlwZSkgJT4lIA0KICAjIGZpbHRlcihpbnRlcjEgIT0gImlkZW50aXR5X21pbGl0aWFzIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBjb3VudCwgeSA9IGV2ZW50X3R5cGUsIGZpbGwgPSBldmVudF90eXBlKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArDQogIGZhY2V0X3dyYXAofiBpbnRlcjEsIHNjYWxlcyA9ICJmcmVlX3giKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIA0KICAgICAgIHkgPSAiVHlwZSBvZiBjb25mbGljdCBldmVudCIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSB0eXBlIG9mIGNvbmZsaWN0IGFjdG9yIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCg0KDQpgYGANCg0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5LXRhYmxlLWV2ZW50X3R5cGV9DQphY3RvcnMgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl90eXBlID0gaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCkpICU+JSAgDQogIHRyYW5zcG9zZV9kZigpICU+JSANCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXIgPSAxKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKCJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJzdGF0ZV9mb3JjZXMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSwNCiAgICAgICAgICAgIH4gYXMubnVtZXJpYygueCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYnkgYWN0b3IgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIGRpZ2l0cyA9IDApICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjIgRmF0YWxpdGllcyBieSBhY3RvciB0eXBlDQoNClRoZSBwbG90IGJlbG93IG9uIGZhdGFsaXRpZXMgc2hvd3MgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHR5cGUgb2YgYWN0b3IuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBBQ0xFRCBkYXRhc2V0IGRvZXMgbm90IGhhdmUgYSBjb2x1bW4gdG8gYXNzaWduIGJsYW1lLiBTaW1pbGFyIHRvIHRoZSBwbG90IG9uIGV2ZW50IHR5cGVzIGFib3ZlLCBkdXBsaWNhdGlvbnMgaGF2ZSBiZWVuIGluY2x1ZGVkLCB0aG91Z2ggbm90IHdpdGhpbiB0aGUgdG90YWxzIGZvciBlYWNoIGFjdG9yIHR5cGUuIA0KDQpGb3IgaW5zdGFuY2UsIHVuZGVyIGZhdGFsaXRpZXMgcmVsYXRlZCB0byBwcm90ZXN0cywgYHIgZmlsdGVyKGFjdG9ycywgaW50ZXIxID09ICJwcm90ZXN0ZXJzIikgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIGZhdGFsaXRpZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGggcHJvdGVzdGVycywgd2l0aCB0aGUgbWFpbiBvdGhlciBwYXJ0eSBpbnZvbHZlZCBhbG1vc3QgZW50aXJlbHkgYmVpbmcgc3RhdGUgZm9yY2VzLCB3aXRoIHZlcnkgc21hbGwgbnVtYmVycyBiZWluZyBhc3NvY2lhdGVkIHdpdGggcmlvdGVycy4gDQoNCjxicj4NCg0KYGBge3IgYWN0b3ItZmFjZXQtZXZlbnQtZmF0YWxpdGllcywgZmlnLmhlaWdodD03fQ0KDQphY3RvcnMgJT4lDQogIG11dGF0ZShldmVudF90eXBlID0gZmN0X3JlbGV2ZWwoZXZlbnRfdHlwZSwgYygiQmF0dGxlcyIsICJFeHBsb3Npb25zL1JlbW90ZSB2aW9sZW5jZSIsICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdGVzdHMiLCAiUmlvdHMiLCAiU3RyYXRlZ2ljIGRldmVsb3BtZW50cyIpKSkgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUsIGV2ZW50X3R5cGUsIGludGVyMSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiAgZmlsdGVyKGludGVyMSAlb3V0JSBjKCJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSAlPiUgDQogIG11dGF0ZShwY190b3RhbCA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmYXRhbGl0aWVzLCB5ID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZmFjZXRfd3JhcCh+IGludGVyMSwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIA0KICAgICAgIHkgPSAiVHlwZSBvZiBjb25mbGljdCBldmVudCIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGFjdG9yIHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgdHlwZSBvZiBjb25mbGljdCBhY3RvciIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCmBgYA0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5LXRhYmxlLWZhdGFsaXRpZXN9DQphY3RvcnMgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl90eXBlID0gaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgIA0KICB0cmFuc3Bvc2VfZGYoKSAlPiUgDQogIHJvd190b19uYW1lcyhyb3dfbnVtYmVyID0gMSkgJT4lIA0KICBtdXRhdGVfYXQodmFycygicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAic3RhdGVfZm9yY2VzIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIiksDQogICAgICAgICAgICB+IGFzLm51bWVyaWMoLngpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgZGlnaXRzID0gMCkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KDQojIyMgNS4zIFdoaWNoIGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXM/DQoNClRoZSB0YWJsZSBiZWxvdyBzdW1tYXJpc2VzIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhbmQgY29uZmxpY3QgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFyZ2VzdCBhY3RvcnMuIFRoZSB0YWJsZSBoYXMgYmVlbiBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBudW1iZXIgb2YgZmF0YWxpdGllczsgb25seSBhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiAxMDAgZmF0YWxpdGllcyBhcmUgc2hvd24gYW5kIGFsbCBvdGhlciBhY3RvcnMgaGF2ZSBiZWVuIGx1bXBlZCB0b2dldGhlciBhcyAiT3RoZXIiLiANCg0KYGBge3IgdGFibGUtZmF0YWxpdGllcy1zdW1tYXJ5fQ0KYWN0b3JzICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBldmVudHMgPSBuKCkpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IGlmZWxzZShmYXRhbGl0aWVzID49IDEwMCwgYWN0b3Jfc2ltcGxlLCAiT3RoZXIiKSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBldmVudHMgPSBzdW0oZXZlbnRzKSkgJT4lDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIHNlbGVjdChhY3Rvcl9zaW1wbGUsIGludGVyMSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IHN0cl9yZW1vdmUoYWN0b3Jfc2ltcGxlLCAiXFw6LioiKSwNCiAgICAgICAgIGZhdGFsaXRpZXNfcGVyX2V2ZW50ID0gcm91bmQoZmF0YWxpdGllcyAvIGV2ZW50cywgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KGFjdG9yID0gYWN0b3Jfc2ltcGxlLCBhY3Rvcl90eXBlID0gaW50ZXIxLCBmYXRhbGl0aWVzLCBldmVudHMsIGZhdGFsaXRpZXNfcGVyX2V2ZW50KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhmYXRhbGl0aWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvcCAyMDIxIGFjdG9ycyBpbiB0ZXJtcyBvZiBmYXRhbGl0aWVzOyBhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGxlc3MgdGhhbiAxMDAgZmF0YWxpdGllcyBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGFzICdPdGhlciciLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+DQoNCkFzIG1lbnRpb25lZCwgaXQgaXMgZGlmZmljdWx0IGF0IHRoaXMganVuY3R1cmUgdG8gc3RhdGUgaG93IG1hbnkgb2YgdGhlIGFzc29jaWF0ZWQgZmF0YWxpdGllcyB3ZXJlIHBlcnNvbnMga2lsbGVkIGJ5IHRoZXNlIGdyb3VwcyBhbmQgaG93IG1hbnkgd2VyZSBtZW1iZXJzIG9mIHRoZXNlIGdyb3VwcyBoYWQgYmVlbiB0aGUgb25lcyB3aG8gd2VyZSBraWxsZWQuIFN0aWxsLCBpdCBpcyB3b3J0aHdoaWxlIHRvIHBsb3Qgd2hpY2ggYWN0b3JzIGFyZSB0aGUgImJsb29kaWVzdCIsIGF0IGxlYXN0IGluIHJlZ2FyZHMgdG8gdGhlIG91dGNvbWVzIG9mIHRoZWlyIGFjdGlvbnMsIG9yIGhhdmUgYmVlbiBpbnZvbHZlZCBpbiBpbmNpZGVudHMgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzLiANCg0KVGhlIHBsb3QgYmVsb3cgc2Vla3MgdG8gZXhhbWluZSB3aGljaCBhY3RvcnMgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzIHBlciBldmVudCwgYW5kIG9ubHkgYWN0b3JzIHdoaWNoIGhhdmUgcGFydGljaXBhdGVkIGluIG1vcmUgdGhhbiA1MCBjb25mbGljdCBldmVudHMgaGF2ZSBiZWVuIGluY2x1ZGVkLiBUaGUgcG9pbnQgc2hvd3MgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgcGVyIGNvbmZsaWN0IGV2ZW50IGl0IHdhcyBpbnZvbHZlZCBpbi4gVGhlIHdoaXNrZXJzIHNob3cgdGhlIHVwcGVyIGFuZCBsb3dlciByYW5nZXMgb2YgZmF0YWxpdGllcyBwZXIgZXZlbnQsIHRoYXQgaXMsIDk1JSBvZiBhbGwgY29uZmxpY3QgZXZlbnRzIHRoYXQgYW4gYWN0b3IgcGFydGljaXBhdGVkIGluIGZlbGwgd2l0aGluIHRoYXQgcmFuZ2UuIFRoZSBoaWdoZXN0IG51bWJlcnMgb2YgZmF0YWxpdGllcyBwZXIgZXZlbnQgYXJlIGFzc29jaWF0ZWQgd2l0aCBwb2xpdGljYWwgbWlsaXRpYXMgYW5kIHJlYmVsIGdyb3Vwcy4gIA0KDQo8YnI+DQoNCmBgYHtyIGZhdGFsaXRpZXMtYWN0b3JzLWVycm9yYmFyaCwgZmlnLmhlaWdodD02fQ0KYWN0b3JzX2NvbmZfaW50IDwtIGFjdG9ycyAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGFkZF9jb3VudChhY3Rvcl9zaW1wbGUpICU+JSANCiAgZmlsdGVyKG4gPiA1MCkgJT4lIA0KICBuZXN0KC1hY3Rvcl9zaW1wbGUpICU+JSANCiAgbXV0YXRlKG1vZGVsID0gbWFwKGRhdGEsIH4gdC50ZXN0KC4kZmF0YWxpdGllcykpKSAlPiUgDQogIHVubmVzdF9sZWdhY3kobWFwKG1vZGVsLCB0aWR5KSkNCg0KYWN0b3JzX2NvbmZfaW50ICU+JSAgDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIHNlbGVjdChhY3Rvcl9zaW1wbGUsIGludGVyMSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAic3RhdGVfZm9yY2VzIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSBzdHJfcmVtb3ZlKGFjdG9yX3NpbXBsZSwgIlxcOi4qIiksDQogICAgICAgICBhY3Rvcl9zaW1wbGUgPSBmY3RfcmVvcmRlcihhY3Rvcl9zaW1wbGUsIGVzdGltYXRlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IGFjdG9yX3NpbXBsZSwgY29sb3VyID0gaW50ZXIxKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyANCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMTUpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA3LCBieSA9IDEpKSArDQogICMgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKyANCiAgbGFicyh4ID0gIkF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIGNvbmZsaWN0IGV2ZW50IiwNCiAgICAgIHkgPSAiQ29uZmxpY3QgYWN0b3IiLCANCiAgICAgIHRpdGxlID0gIldoaWNoIGNvbmZsaWN0IGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXMgcGVyIGV2ZW50PyIsIA0KICAgICAgc3VidGl0bGUgPSAiT25seSBpbmNsdWRlcyBhY3RvcnMgaW52b2x2ZWQgaW4gbW9yZSB0aGFuIDUwIGNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsDQogICAgICBjb2xvdXIgPSAiIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpgYGANCg0KPGJyPjxicj4gDQoNCiMjIyA1LjQgU3VtbWFyeSB0YWJsZSBvZiBtYWluIGNvbmZsaWN0IGFjdG9ycyBieSBhY3RvciB0eXBlDQoNCmBgYHtyIHRhYmxlLW1haW4tY29uZmxpY3QtYWN0b3JzfQ0KdG9wX2FjdG9ycyA8LSBhY3RvcnMgJT4lICANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgY291bnQoaW50ZXIxLCBhY3Rvcl9zaW1wbGUsIHNvcnQgPSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KGludGVyMSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfZ3JvdXBgID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoZXZlbnRzID0gbiwNCiAgICAgICAgIGFjdG9yX3R5cGUgPSBpbnRlcjEsDQogICAgICAgICBhY3Rvcl9uYW1lID0gYWN0b3Jfc2ltcGxlKSAlPiUgDQogIHRvcF9uKG4gPSA1KSAlPiUgIGFycmFuZ2UoYWN0b3JfdHlwZSkNCg0Ka2FibGUodG9wX2FjdG9ycywgY2FwdGlvbiA9ICJUb3AgNSBjb25mbGljdCBhY3RvcnMgaW4gMjAyMSBieSBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBwYWNrX3Jvd3MoaW5kZXggPSB0YWJsZSh0b3BfYWN0b3JzJGFjdG9yX3R5cGUpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjUgR2VvZ3JhcGhpYyBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgYWN0b3JzDQoNClNhZ2FpbmcsIGFnYWluLCBpcyBhbiBvdXRsaWVyIGFuZCBpcyBob21lIHRvIGEgbWFzc2l2ZSBjb25jZW50cmF0aW9uIG9mIGNvbmZsaWN0IGFjdG9ycywgZXhjZWVkaW5nIGV2ZW4gdHJhZGl0aW9uYWxseS10YXJnZXRlZCBhcmVhcyBpbiBLYWNoaW4sIG5vcnRoZXJuIFNoYW4gYW5kIFJha2hpbmUuIA0KDQo8YnI+DQoNCmBgYHtyIG1hcC1jb25mbGljdC1hY3RvcnMtdG93bnNoaXAsIGZpZy5oZWlnaHQ9MTB9DQphY3RvcnMgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoY29uZmxpY3RfYWN0b3JzID0gbl9kaXN0aW5jdChhY3Rvcl9zaW1wbGUpKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb25mbGljdF9hY3RvcnMpLCBzaXplID0gMC4wMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyhmaWxsID0gIm51bWJlciBvZlxuIGNvbmZsaWN0IGFjdG9ycyIsDQogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIDIwMjEgY29uZmxpY3QgYWN0b3JzIGF0IHRvd25zaGlwIGxldmVsIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCiAgDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCg0KIyMgNi4gQ29ycmVsYXRpb25zIGJldHdlZW4gY29uZmxpY3QgYW5kIGZvb2Qgc2VjdXJpdHkgY2x1c3RlciBmb290cHJpbnQgDQoNCg0KIyMjIDYuMSBDb3JyZWxhdGlvbiBwbG90DQoNCmBgYHtyIGNvbmZsaWN0LXNjb3JlLWRmLCB3YXJuaW5nPUZBTFNFfQ0KY29uZmxpY3RfZGYgPC0gYWNsZWQgJT4lIA0KICAjIGRvIHlvdSByZWFsbHkgbmVlZCB0aGlzIHN0ZXAgc2luY2UgeW91J3JlIHVzaW5nIEJldHRpLVZlcm1hDQogIG11dGF0ZShldmVudF90eXBlID0gY2FzZV93aGVuKGV2ZW50X3R5cGUgPT0gIlByb3Rlc3RzIiB+ICJQcm90ZXN0c19hbmRfUmlvdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlID09ICJSaW90cyIgfiAiUHJvdGVzdHNfYW5kX1Jpb3RzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBldmVudF90eXBlKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUNCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGV2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gY291bnQpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiYXR0bGVzID0gMCwgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgPSAwLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyA9IDAsDQogICAgICAgICAgICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzID0gMCwgcHJvdGVzdHNfYW5kX3Jpb3RzID0gMCkpICU+JSANCiAgIyBtdXRhdGUodG90YWxfZXZlbnRzID0gcm93U3VtcyhhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICB1bmdyb3VwKCkNCiAgDQppbmRleF9zaGFyZXMgPC0gY29uZmxpY3RfZGYgJT4lICAgDQogIG11dGF0ZV9hdCh2YXJzKGMoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBmYXRhbGl0aWVzLA0KICAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHByb3Rlc3RzX2FuZF9yaW90cykpLCANCiAgICAgICAgICAgc2NhbGUpICU+JSAgDQogIG11dGF0ZV9hdCh2YXJzKGMoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBmYXRhbGl0aWVzLA0KICAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHByb3Rlc3RzX2FuZF9yaW90cykpLCANCiAgICAgICAgICAgZnVucygoLiAtIG1pbiguLCBuYS5ybSA9IFQpKS8obWF4KC4sIG5hLnJtID0gVCkgLSBtaW4oLiwgbmEucm0gPSBUKSkpKSAlPiUgDQogIG1kZXByaXYoYygiYmF0dGxlcyIsICJleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSIsICJ2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyIsICJmYXRhbGl0aWVzIiwgInN0cmF0ZWdpY19kZXZlbG9wbWVudHMiLCAicHJvdGVzdHNfYW5kX3Jpb3RzIiksDQogICAgICAgICAgbWV0aG9kID0gImJ2Iiwgb3V0cHV0ID0gImFsbCIpDQoNCmNvbmZsaWN0X3Njb3JlIDwtIGNvbmZsaWN0X2RmICU+JSANCiAgbGVmdF9qb2luKGluZGV4X3NoYXJlcyRkYXRhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSwgDQogICAgICAgICAgICAgICAgICAgICBzY29yZV9pLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfYmF0dGxlcyA9IGJhdHRsZXMsIA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgPSBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwNCiAgICAgICAgICAgICAgICAgICAgIGluZGV4X3Zpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zID0gdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfZmF0YWxpdGllcyA9IGZhdGFsaXRpZXMsIA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfc3RyYXRlZ2ljX2RldmVsb3BtZW50cyA9IHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfcHJvdGVzdHNfYW5kX3Jpb3RzID0gcHJvdGVzdHNfYW5kX3Jpb3RzKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUoZW52X2JhdHRsZXMgPSBiYXR0bGVzIC8gbWF4KGJhdHRsZXMpLCANCiAgICAgICAgIGVudl9leHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSA9IGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlIC8gbWF4KGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlKSwNCiAgICAgICAgIGVudl92aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyA9IHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zIC8gbWF4KHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSwgDQogICAgICAgICBlbnZfZmF0YWxpdGllcyA9IGZhdGFsaXRpZXMgLyBtYXgoZmF0YWxpdGllcyksIA0KICAgICAgICAgc2NvcmVfZW52ID0gKGVudl9iYXR0bGVzICsgZW52X2V4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgZW52X3Zpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zICsgZW52X2ZhdGFsaXRpZXMpIC8gNCkgJT4lIA0KICBsZWZ0X2pvaW4oYWNsZWQgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChhZG1pbjEsIGFkbWluMywgYWRtaW4zX3Bjb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JSAgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXNbdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyJdKSksIGJ5ID0gImFkbWluM19wY29kZSIpDQoNCiMgY29uZmxpY3Rfc2NvcmUgJT4lIGRvLmNhbGwoZGF0YS5mcmFtZSwgLikgJT4lIGFzX3RpYmJsZSgpICU+JSB3cml0ZV9jc3YoImNvbmZsaWN0X3Njb3JlLmNzdiIpDQpgYGANCg0KDQoNClRoZSBjb3JyZWxhdGlvbiBwbG90IGJlbG93IGNvbXBhcmVzIHRoZSBtYWpvciBjb25mbGljdCBpbmRpY2F0b3JzIHdpdGggdGhvc2UgdGhlIG51bWJlcnMgb2YgRlNDIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIGF0IHRvd25zaGlwIGxldmVsLiBUaGUgZGFya2VyIHRoZSBjb2xvdXJzIGFuZCB0aGUgbGFyZ2VyIHRoZSBjaXJjbGVzLCB0aGUgZ3JlYXRlciB0aGUgZGVncmVlIG9mIGNvcnJlbGF0aW9uLCB3aXRoICArMSBiZWluZyBhIHBlcmZlY3QgcG9zaXRpdmUgY29ycmVsYXRpb24gYW5kIC0xIGJlaW5nIGEgcGVyZmVjdCBuZWdhdGl2ZSBjb3JyZWxhdGlvbi4gVG8gc2VlIGEgc3BlY2lmaWMgcmVsYXRpb25zaGlwLCBmaW5kIHRoZSBzcXVhcmUgd2hlcmUgdHdvIHZhcmlhYmxlcyBpbnRlcnNlY3QuIEZvciBpbnN0YW5jZSwgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIG51bWJlciBvZiBiYXR0bGVzIGFuZCB0aGUgbnVtYmVyIG9mIEZTQyBiZW5lZmljaWFyaWVzIGlzIHRoZSBsYXN0IHNxdWFyZSBpbiB0aGUgZmlyc3Qgcm93LiANCg0KQ29uZmxpY3QgaW5kaWNhdG9ycyB0ZW5kIHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4gT25seSB2ZXJ5IHdlYWsgY29ycmVsYXRpb25zIGFyZSBub3RlZCBiZXR3ZWVuIHRoZSBwcmVzZW5jZSBvZiBGU0MgcGFydG5lcnMgYmVuZWZpY2lhcmllcyBhbmQgdGhlIGluY2lkZW5jZSBvZiBjb25mbGljdC4gDQoNCjxicj4NCg0KYGBge3Igc21hbGwtY29ycnBsb3R9DQoNCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0c19hbmRfcmlvdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCANCiAgICAgICAgIGZhdGFsaXRpZXMsIHBhcnRuZXJzLCBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGZpbHRlcighaXMubmEocGFydG5lcnMpICYgIWlzLm5hKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGNvcihtZXRob2QgPSBjKCJwZWFyc29uIikpICU+JSANCiAgY29ycnBsb3QodHlwZSA9ICJ1cHBlciIsIGNvbCA9IGJyZXdlci5wYWwobiA9IDgsIG5hbWUgPSAiUmRZbEJ1IiksIHRsLnNydCA9IDM1LCANCiAgICAgICAgICAgdGl0bGUgPSAiQ29ycmVsYXRpb24gcGxvdCBiZXR3ZWVuIGNvbmZsaWN0IGluZGljYXRvcnMgYW5kIEZTQyBwcmVzZW5jZSBcbiIsICBtYXI9YygwLDAsMiwwKSwgZGlhZyA9IEZBTFNFKQ0KICANCmBgYA0KDQo8YnI+DQoNCkFkZGl0aW9uYWwgZGV0YWlsIGlzIHJlbmRlcmVkIGluIHRoaXMgbmV4dCwgbGFyZ2VyIGNvcnJlbGF0aW9uIHBsb3QuIEl0IGtlZXBzIGFsbCB0aGUgc2FtZSB2YXJpYWJsZXMgYXMgdGhlIHBsb3QgYWJvdmUsIGJ1dCBqdXN0IHByb3ZpZGVzIHNvbWUgbW9yZSBpbmZvcm1hdGlvbi4gVGhlIHBsb3QgYmVsb3cgaXMgc3BsaXQgaW50byB1cHBlciBhbmQgbG93ZXIgdHJpYW5nbGVzLCBkaXZpZGVkIGRvd24gdGhlIGRpYWdvbmFsIGJ5IHRoZSBoaXN0b2dyYW1zIGluIGJsdWUuIA0KDQpUaGUgbnVtYmVycyBpbiB0aGUgdXBwZXIgdHJpYW5nbGUgYXJlIHRoZSBzcGVjaWZpYyBudW1lcmljIHZhbHVlcyBvZiB0aGUgYmx1ZSBhbmQgeWVsbG93IGNpcmNsZXMgYWJvdmUsIGluZGljYXRpbmcgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IChiZXR3ZWVuICsxIGFuZCAtMSksIHdpdGggdGhlIGFzdGVyaXNrcyBkZW5vdGluZyB0aGUgbGV2ZWwgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZXNlIGNvcnJlbGF0aW9ucy4gVGhlIGhpc3RvZ3JhbXMgZG93biB0aGUgZGlhZ29uYWwgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggdmFyaWFibGUgLS0gZm9yIHRoZSBjb25mbGljdCB2YXJpYWJsZXMsIHRoZSBiYXJzIGFyZSBza2V3ZWQgdG8gdGhlIGxlZnQsIGluZGljYXRpbmcgdGhhdCBtb3N0IHRvd25zaGlwcyBoYXZlIHJlbGF0aXZlbHkgbG93IGxldmVscyBvZiBjb25mbGljdC4gDQoNClRoaXMgaXMgYm9ybmUgb3V0IGluIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBsb3dlciB0cmlhbmdsZSwgd2hlcmUgZWFjaCBwb2ludCBpcyBhIHRvd25zaGlwIGFuZCB0aGUgcmVkIGxpbmUgc2hvd3MgdGhlIGxpbmVhciBmaXQgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdmFyaWFibGVzLiBNb3N0IHRvd25zaGlwcyB0ZW5kIHRvIGJlIGNvbmNlbnRyYXRlZCBhcm91bmQgdGhlIGJvdHRvbS1sZWZ0IHF1YWRyYW50IG9mIHRoZSBjaGFydCwgd2l0aCBtYW55IG91dGxpZXJzLiBUaGUgc3RlZXBlciB0aGUgZ3JhZGllbnQgb2YgcmVkIGxpbmUsIHRoZSBzdHJvbmdlciB0aGUgY29ycmVsYXRpb24uIA0KDQpGb3IgaW5zdGFuY2UsIHRoZSB0d28gdmFyaWFibGVzIG1vc3QgaGlnaGx5LWNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyIGFyZSB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyBhbmQgc3RyYXRlZ2ljIGRldmVsb3BtZW50czogdGhleSBzaGFyZSBhIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IG9mIDAuNzksIG1lYW5pbmcgdGhhdCBpbiA3OSUgb2YgdGhlIHRvd25zaGlwcyBpbiB3aGljaCB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyBvY2N1cnJlZCwgc3RyYXRlZ2ljIGRldmVsb3BtZW50cyBhbHNvIHRvb2sgcGxhY2UgKHRoZSBtb3N0IGNvbW1vbiBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIHdlcmUgYXJyZXN0cyBhbmQgcHJvcGVydHkgZGFtYWdlKS4gVGhpcyByZWxhdGlvbnNoaXAgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgdGhhdCBpcyB0byBzYXksIGl0IHdhcyBub3QgYnkgY2hhbmNlIHRoYXQgdGhlc2UgdHdvIHR5cGVzIG9mIGNvbmZsaWN0IGV2ZW50cyB0ZW5kZWQgdG8gb2NjdXIgaW4gdGhlIHNhbWUgcGxhY2VzLiANCg0KDQo8YnI+DQoNCmBgYHtyIGNvcnJwbG90LCBmaWcuaGVpZ2h0PTcuNX0NCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgbXV0YXRlKGxvZ19iZW5lZmljaWFyaWVzID0gbG9nKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHNlbGVjdChiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIHByb3Rlc3RzX2FuZF9yaW90cywgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgDQogICAgICAgICBmYXRhbGl0aWVzLCBwYXJ0bmVycywgbG9nX2JlbmVmaWNpYXJpZXMpICU+JQ0KICBwYWlycy5wYW5lbHMoc21vb3RoID0gVFJVRSwgICAgICAjIElmIFRSVUUsIGRyYXdzIGxvZXNzIHNtb290aHMNCiAgICAgICAgICAgICAgIHNjYWxlID0gRkFMU0UsICAgICAgIyBJZiBUUlVFLCBzY2FsZXMgdGhlIGNvcnJlbGF0aW9uIHRleHQgZm9udA0KICAgICAgICAgICAgICAgZGVuc2l0eSA9IFRSVUUsICAgICAjIElmIFRSVUUsIGFkZHMgZGVuc2l0eSBwbG90cyBhbmQgaGlzdG9ncmFtcw0KICAgICAgICAgICAgICAgZWxsaXBzZXMgPSBGQUxTRSwgICAjIElmIFRSVUUsIGRyYXdzIGVsbGlwc2VzDQogICAgICAgICAgICAgICBtZXRob2QgPSAicGVhcnNvbiIsICMgQ29ycmVsYXRpb24gbWV0aG9kIChhbHNvICJzcGVhcm1hbiIgb3IgImtlbmRhbGwiKQ0KICAgICAgICAgICAgICAgcGNoID0gOCwgICAgICAgICAgICAjIHBjaCBzeW1ib2wNCiAgICAgICAgICAgICAgIGxtID0gVFJVRSwgICAgICAgICAgIyBJZiBUUlVFLCBwbG90cyBsaW5lYXIgZml0IHJhdGhlciB0aGFuIHRoZSBMT0VTUyAoc21vb3RoZWQpIGZpdA0KICAgICAgICAgICAgICAgY29yID0gVFJVRSwgICAgICAgICAjIElmIFRSVUUsIHJlcG9ydHMgY29ycmVsYXRpb25zDQogICAgICAgICAgICAgICBqaWdnbGUgPSBGQUxTRSwgICAgICMgSWYgVFJVRSwgZGF0YSBwb2ludHMgYXJlIGppdHRlcmVkDQogICAgICAgICAgICAgICBmYWN0b3IgPSAyLCAgICAgICAgICMgSml0dGVyaW5nIGZhY3Rvcg0KICAgICAgICAgICAgICAgaGlzdC5jb2wgPSA0LCAgICAgICAjIEhpc3RvZ3JhbXMgY29sb3INCiAgICAgICAgICAgICAgIHN0YXJzID0gVFJVRSwgICAgICAgIyBJZiBUUlVFLCBhZGRzIHNpZ25pZmljYW5jZSBsZXZlbCB3aXRoIHN0YXJzDQogICAgICAgICAgICAgICBjaSA9IEZBTFNFLCAgICAgICAgICMgSWYgVFJVRSwgYWRkcyBjb25maWRlbmNlIGludGVydmFscw0KICAgICAgICAgICAgICAgbWFpbiA9ICJDb3JyZWxhdGlvbiBwbG90IG9mIGNvbmZsaWN0IGluZGljYXRvcnMgKGFjbGVkZGF0YS5jb20pIGFuZCBGU0MgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMiKQ0KYGBgDQoNCjxicj4NCg0KVGhlIG51bWJlcnMgb2YgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMgcGVyIHRvd25zaGlwIHdlcmUsIHVuc3VycHJpc2luZ2x5LCBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4gSG93ZXZlciwgdGhlIG51bWJlciBvZiBwYXJ0bmVycyBwZXIgdG93bnNoaXAgd2FzIG9ubHkgc2xpZ2h0bHkgY29ycmVsYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgYmF0dGxlcyBhbmQgdGhlIG51bWJlciBvZiBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UgLS0gdGhpcyBwYXR0ZXJuIGxpa2VseSBvbmx5IGhvbGRzIGZvciBjZXJ0YWluIHN0YXRlcy4gVGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaXMgbm90IGNvcnJlbGF0ZWQgd2l0aCBhbnkgY29uZmxpY3QgaW5kaWNhdG9ycy4gIA0KDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgUmV2aXNpdGluZyB0aGUgTUlNVS1IQVJQIGNvbmZsaWN0IGluZGV4DQoNCkEgY29uZmxpY3Qgc2NvcmUgd2FzIHRoZW4gY2FsY3VsYXRlZCB1c2luZyBBQ0xFRCBkYXRhOiBpdHMgY29uc3RydWN0aW9uIHdhcyBzaW1pbGFyIHRvIHRoZSBjb25mbGljdCBpbmRleCBpbiB0aGUgW01JTVUtSEFSUCBWdWxuZXJhYmlsaXR5IEFuYWx5c2lzXShodHRwOi8vdGhlbWltdS5pbmZvL3Z1bG5lcmFiaWxpdHktaW4tbXlhbm1hciksIHdpdGggdGhlIG5vdGFibGUgb21pc3Npb24gb2YgZGF0YSBvbiBkaXNwbGFjZW1lbnQgLS0gdGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHRoZSBzY29yZSB3aWxsIGJlIHVwZGF0ZWQgb25jZSB0aGF0IGRhdGEgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUuDQoNClRoZSBjb25mbGljdCBzY29yZSAtLSBhdCBpdHMgbW9zdCBiYXNpYyBsZXZlbCAtLSBpcyBhbiBhdmVyYWdlIG9mIHRoZSBub3JtYWxpc2VkIHZhbHVlcyBvZiBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zLCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzIGFuZCB0aGUgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzLiBIb3dldmVyLCB0aGVzZSBub3JtYWxpc2VkIHZhbHVlcyBoYXZlIGJlIHJlLXdlaWdodGVkIHdpdGggdGhlIEJldHRpLVZlcm1hIG1ldGhvZCwgd2hpY2ggcGVuYWxpc2VzIHJlZHVuZGFuY3kgYW5kIHJld2FyZHMgdmFyaWF0aW9uOyB0aGlzIGlzIHRoZSBvdGhlciBub3RhYmxlIGRpdmVyZ2VuY2UgZnJvbSBNSU1VLUhBUlAncyBtZXRob2RvbG9neS4gVGhlIEJldHRpLVZlcm1hIG1ldGhvZCB3YXMgZW1wbG95ZWQgdGhyb3VnaCB0aGUgKipgbWRlcHJpdmAqKiBSIHBhY2thZ2UgZGV2ZWxvcGVkIGJ5IEF0aWxsaW8gQmVuaW5pIGFuZCBBbGRvIEJlbmluaS4gDQoNCkJlbG93IGlzIGEgcGxvdCBvZiB0b3duc2hpcHMgY29tcGFyaW5nIHRoZSBjb25mbGljdCBzY29yZSB3aXRoIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcy4gDQoNCjxicj4NCg0KYGBge3Igc2NvcmUtaS1iZW4tcGxvdH0NCiMgdGhlcmUgaXMgbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gY29uZmxpY3Qgc2NvcmUgYW5kIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBvciBudW1iZXIgb2YgcGFydG5lcnMgcGVyIHRvd25zaGlwDQpjb25mbGljdF9zY29yZSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IHNjb3JlX2kpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHkgPSAiQ29uZmxpY3Qgc2NvcmUiLCANCiAgICAgICB0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIGNvbmZsaWN0IHNjb3JlIGF0IHRvd25zaGlwIGxldmVsIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJIaWdoZXIgY29uZmxpY3Qgc2NvcmVzIGluZGljYXRlIG1vcmUgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZXM6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20gYW5kIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIikgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCjxicj4NCkFzIGV4cGVjdGVkLCBmcm9tIHJldmlld2luZyB0aGUgY29ycmVsYXRpb24gcGxvdCBhYm92ZSBhbmQgZnJvbSB0aGUgZmxhdCBibHVlIGxpbmUsIHRoZSBpbmNpZGVuY2Ugb2YgY29uZmxpY3QgKHJlcHJlc2VudGVkIGJ5IHRoZSBjb25mbGljdCBzY29yZSwgd2hlcmUgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgaW5jaWRlbmNlIG9mIGNvbmZsaWN0KSBoYXMgbm8gZGlzY2VybmlibGUgcmVsYXRpb25zaGlwIC0tIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIC0tIHdpdGggdGhlIG51bWJlciBvZiBGU0MgYmVuZWZpY2lhcmllcy4gVGhlIGJsdWUgbGluZSBqdXN0IHNob3dzIGEgc2ltcGxlIGxpbmVhciBtb2RlbCwgdGhlIHN1bW1hcnkgb2Ygd2hpY2ggaXMgcHJpbnRlZCBiZWxvdzoNCg0KPGJyPg0KDQpgYGB7ciBsbS1vdXRwdXR9DQpjb25mbGljdF9zY29yZSAlPiUNCiAgcmVuYW1lKGNvbmZsaWN0X3Njb3JlID0gc2NvcmVfaSkgJT4lIA0KICBsbShjb25mbGljdF9zY29yZSB+IGJlbmVmaWNpYXJpZXMgKyBwYXJ0bmVycywgZGF0YSA9IC4pICU+JSANCiAgc3VtbWFyeSgpICU+JSBwYW5kZXIoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxpbmVhciBtb2RlbCIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDYuMyBUb3duc2hpcC1sZXZlbCBkaXN0cmlidXRpb25zIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcw0KDQpUaGUgc2NhdHRlcnBsb3QgYmVsb3cgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgdG93bnNoaXAuIFRoZSBtZWFucyBvZiBib3RoIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYW5kIG51bWJlciBvZiBmYXRhbGl0aWVzIGhhdmUgYmVlbiBtYXJrZWQgYnkgZG90dGVkIHJlZCBsaW5lcywgZGl2aWRpbmcgdGhlIHBsb3QgaW50byBmb3VyIHF1YWRyYW50cy4gV2hpbHN0IG1vcmUgZGV0YWlsZWQgcHJpb3JpdGlzYXRpb24gaXMgd2FycmFudGVkLCBpdCBpcyBhbHJlYWR5IHZlcnkgY2xlYXIgdGhhdCBpbnRlcnZlbnRpb25zIHNob3VsZCBiZSB0YXJnZXRlZCBhdCwgYWJvdmUgYWxsLCB0aGUgNTcgdG93bnNoaXBzIGluIHRoZSB1cHBlci1yaWdodCBxdWFkcmFudDsgdGhhdCBpcywgdGhvc2Ugd2hpY2ggaGF2ZSBleHBlcmllbmNlZCBhbiBhYm92ZSBhdmVyYWdlIG51bWJlciBvZiBjb25mbGljdCBmYXRhbGl0aWVzIGFuZCBldmVudHMuIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHRvd25zaGlwIHJlZmVyZW5jZSB0YWJsZSBpbiBzZWN0aW9uIDkuMS4gIA0KDQo8YnI+DQoNCmBgYHtyIHNjYXR0ZXJwbG90LWV2ZW50cy1mYXRhbGl0aWVzLXRzcH0NCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3RzIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwNCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRzLCB5ID0gZmF0YWxpdGllcykpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGZhdGFsaXRpZXMsIGNvbG91ciA9IGV2ZW50cykpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1MDAsIGJ5ID0gMTAwKSkgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihmYXRhbGl0aWVzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGV2ZW50cykpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBsYWJzKHggPSAiQ29uZmxpY3QgZXZlbnRzIiwgDQogICAgICAgeSA9ICJGYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgdG93bnNoaXAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNZWFucyBvZiBib3RoIGF4ZXMgYXJlIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lIikNCiAgDQogIA0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDcuIEFncmljdWx0dXJlIGFuZCBjb25mbGljdCANCg0KIyMjIDcuMSBTdW1tYXJ5IG9mIGFncmljdWx0dXJhbCBzdGF0aXN0aWNzDQoNCmBgYHtyIGRmLWFnLW1hbGl9DQojIGFnX21hbGkgYXJlYXMgc293ZWQgZGF0YXNldA0KDQphZ19tYWxpIDwtIHZ1bG1tciAlPiUgDQogIHNlbGVjdChzdGF0ZV9yZWdpb25fbmFtZSwgc3RhdGVfcmVnaW9uX3Bjb2RlLCB0b3duc2hpcF9wY29kZSwgDQogICAgICAgICBjb250YWlucygibWFsaSIpLCBjb250YWlucygic293bl9hcmVhIiksIGFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QsIHNvd25fYXJlYV9vZl9wYWRkeV9hY3JlcykgJT4lIA0KICBtdXRhdGUocGNfcGFkZHkgPSBzb3duX2FyZWFfb2ZfcGFkZHlfYWNyZXMgLyBhbGxfYXJlYV9zb3dlZF9tYWxpKSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb250YWlucygic293bl9hcmVhIiksIG5hbWVzX3RvID0gImNyb3BfdHlwZSIsIHZhbHVlc190byA9ICJhY3JlcyIpICU+JQ0KICBmaWx0ZXIoY3JvcF90eXBlICE9ICJzb3duX2FyZWFfb2ZfZnJlZW5fZ3JhbV9hbmRfcGVnaW9uX3VyYWRfcGVhX2FjcmVzIikgJT4lIA0KICBtdXRhdGUoYWNyZXMgPSByZXBsYWNlX25hKGFjcmVzLCAwKSkgJT4lIA0KICBtdXRhdGUocGNfdG90YWwgPSBhY3JlcyAvIGFsbF9hcmVhX3Nvd2VkX21hbGkpICU+JSANCiAgbXV0YXRlKGNyb3BfdHlwZSA9IHN0cl9yZW1vdmVfYWxsKGNyb3BfdHlwZSwgInNvd25fYXJlYV9vZl8iKSwNCiAgICAgICAgIGNyb3BfdHlwZSA9IHN0cl9yZW1vdmVfYWxsKGNyb3BfdHlwZSwgIl9hY3JlcyIpLA0KICAgIGNyb3BfdHlwZSA9IGlmZWxzZShjcm9wX3R5cGUgJWluJSBjKCJwYWRkeSIsICJzZXNhbWUiLCAiZ3JlZW5fZ3JhbSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmFkX3BlYSIsICJncm91bmRfbnV0IiwgInBpZ2Vvbl9wZWEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgY3JvcF90eXBlLCAib3RoZXIiKSwgDQogICAgY3JvcF90eXBlID0gZmN0X3JlbGV2ZWwoY3JvcF90eXBlLCAib3RoZXIiLCBhZnRlciA9IEluZikpDQpgYGANCg0KPGJyPiANCg0KVGhlIGxhc3QgeWVhciBpbiB3aGljaCBkZXRhaWxlZCB0b3duc2hpcC1sZXZlbCBhZ3JpY3VsdHVyYWwgc3RhdGlzdGljcyB3ZXJlIG1hZGUgYXZhaWxhYmxlIHdhcyAyMDE2LCB0aGVzZSB3ZXJlIGluY2x1ZGVkIGluIHRoZSBNSU1VLUhBUlAgcmVwb3J0IFtWdWxuZXJhYmlsaXR5IGluIE15YW5tYXJdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKS4gSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBtYWluIHJlYXNvbiB0aGVzZSBzdGF0aXN0aWNzIHdlcmUgcmVsZWFzZWQgd2FzIGR1ZSB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDIwMTUvMjAxNiBOYXRpb25hbCBSZWNvdmVyeSBGcmFtZXdvcmsgYW5kIFBsYW4gZm9yIEZsb29kcyBhbmQgTGFuZHNsaWRlcywgbWVhbmluZyB0aGF0IHNvbWUgb2YgdGhlIHZhbHVlcywgZXNwZWNpYWxseSByZWxhdGVkIHRvIGFyZWEgaGFydmVzdGVkLCBhcmUgYW5vbWFsb3VzLiBIb3dldmVyLCBhZ3JpY3VsdHVyYWwgYXJlYXMgc293biBhcmUgdW5saWtlbHkgdG8gaGF2ZSBzaGlmdGVkIGdyZWF0bHkgaW4gdGhlIHBhc3QgNiB5ZWFycyAtLSAtLSBpbmRlZWQsIHRoZSBzb3duIGFyZWEgb2YgcGFkZHkgaGFzIG9ubHkgdmFyaWVkIGJ5IDAuMSUgYmV0d2VlbiAyMDE1LzIwMTYgYW5kIDIwMTgvMjAxOSB3aGVuIGJlaW5nIGNvbXBhcmVkIGF0IHRoZSBuYXRpb25hbCBsZXZlbC4gDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBzdGF0ZS9yZWdpb25hbCBicmVha2Rvd24gb2YgdGhlIHRvdGFsIHNvd24gYXJlYSBpbiBhY3JlcyBpbiAyMDE1LzIwMTYgYnkgbWFqb3IgY3JvcCB0eXBlLiBBeWV5YXJ3YWR5LCBTYWdhaW5nLCBCYWdvIGFuZCBNYWd3YXkgY29udGFpbiB0aGUgbWFpbiBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiBhcmVhcyBvZiBNeWFubWFyLiBUaG91Z2ggTWFuZGFsYXksIE1hZ3dheSBhbmQgU2FnYWluZyBzaG93IGEgbXVjaCBoaWdoZXIgZGl2ZXJzaXR5IG9mIGNyb3AgdHlwZXMgY29tcGFyZWQgdG8gb3RoZXIgc3RhdGVzL3JlZ2lvbnMgd2hpY2ggYXJlIGRvbWluYXRlZCBieSBwYWRkeS4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1hcmVhLXNvd24tY3JvcC10eXBlLXNyfQ0KYWdfbWFsaSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlX3JlZ2lvbl9uYW1lLCBjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcmVzID0gc3VtKGFjcmVzKSwgLmdyb3VwID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShzdGF0ZV9yZWdpb25fbmFtZSA9IGZhY3RvcihzdGF0ZV9yZWdpb25fbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkF5ZXlhcndhZHkiLCAiU2FnYWluZyIsICJCYWdvIiwgIk1hZ3dheSIsICJNYW5kYWxheSIsICJTaGFuIiwgIllhbmdvbiIsICJSYWtoaW5lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2F5aW4iLCAiTW9uIiwgIkthY2hpbiIsICJUYW5pbnRoYXJ5aSIsICJLYXlhaCIsICJDaGluIiwgIk5heSBQeWkgVGF3IikpLA0KICAgICAgICAgc3RhdGVfcmVnaW9uX25hbWUgPSBmY3RfcmV2KHN0YXRlX3JlZ2lvbl9uYW1lKSkgJT4lIA0KICBmaWx0ZXIoc3RhdGVfcmVnaW9uX25hbWUgIT0gIk5heSBQeWkgVGF3IikgJT4lIA0KICBhcnJhbmdlKGRlc2MoYWNyZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHN0YXRlX3JlZ2lvbl9uYW1lLCB5ID0gYWNyZXMsIGZpbGwgPSBjcm9wX3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgNzAwMDAwMCwgYnkgPSAxMDAwMDAwKSkgKw0KICAjc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInR1cmJvIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgdmp1c3QgPSAwLjcpLA0KICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICBmaWxsID0gIiIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGFjcmVzIHNvd24gYnkgY3JvcCB0eXBlIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUsIExpdmVzdG9jayBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKQ0KDQpgYGANCg0KPGJyPg0KDQpBbHRob3VnaCB0aGUgMjAxNS8yMDE2IGFncmljdWx0dXJhbCBkYXRhIHdlcmUgcmVsZWFzZWQgdG8gZG9jdW1lbnQgdGhlIGxvc3NlcyBmcm9tIGZsb29kcyBhbmQgbGFuZHNsaWRlcywgbXVjaCBjYW4gc3RpbGwgYmUgZ2xlYW5lZCBmcm9tIGFnZ3JlZ2F0aW5nIHRoZSBkYXRhLiBXaXRoIHJlZmVyZW5jZSB0byB0aGUgdGFibGUgYmVsb3csIGl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgbmV0IG1hcmdpbnMgcGVyIGFjcmUgd2VyZSBsb3dlc3QgZm9yIHBhZGR5LCBtZWFuaW5nIHRoYXQgYXJlYXMgd2l0aCBncmVhdGVyIGxldmVscyBvZiBjcm9wIGRpdmVyc2lmaWNhdGlvbiB3aWxsIGJlIHN1ZmZlciBncmVhdGVyIGVjb25vbWljIGltcGFjdHMgZnJvbSBjb25mbGljdCBldmVudHMuIEJ1dCBvbmx5IGdlbmVyYWwgdHJlbmRzIGNhbiBiZSBnbGVhbmVkIGZyb20gdGhlIG5ldCBtYXJnaW5zIG9mIGNyb3BzIGFzIDIwMTUvMjAxNiB3ZXJlIGFub21hbG91cyBkdWUgdG8gdGhlIHdpZGVzcHJlYWQgZmxvb2RpbmcgYW5kIGxhbmRzbGlkZXMuICANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1uZXQtbWFyZ2luc30NCnZ1bG1tciAlPiUgDQogIHNlbGVjdChjb250YWlucygibmV0X21hcmdpbiIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gImNyb3BfdHlwZSIsIHZhbHVlc190byA9ICJuZXRfbWFyZ2luIikgJT4lIA0KICBncm91cF9ieShjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpKSAlPiUgDQogIGZpbHRlcihjcm9wX3R5cGUgJW91dCUgYygiYWxsX2hhcnZlc3RlZF9uZXRfbWFyZ2luX3Blcl9jYXBpdGFfdXNkIiwgImFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QiKSAmDQogICAgICAgICAgIHN0cl9kZXRlY3QoY3JvcF90eXBlLCAic2hhcmVfb2YiLCBuZWdhdGUgPSBUUlVFKSkgJT4lDQogICMgcmVjb2RpbmcgcGFkZHkgLS0gcGFkZHkgaXMganVzdCBjb2RlZCBhcyAibmV0X21hcmdpbl91c2QiDQogIG11dGF0ZShjcm9wX3R5cGUgPSByZWNvZGUoY3JvcF90eXBlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldF9tYXJnaW5fdXNkIiA9ICJwYWRkeSIpKSAlPiUgDQogIG11dGF0ZShjcm9wX3R5cGUgPSBzdHJfcmVtb3ZlX2FsbChjcm9wX3R5cGUsICJuZXRfbWFyZ2luXyIpLCANCiAgICAgICAgIGNyb3BfdHlwZSA9IHN0cl9yZW1vdmVfYWxsKGNyb3BfdHlwZSwgIl91c2QiKSkgJT4lIA0KICBsZWZ0X2pvaW4odnVsbW1yICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoY29udGFpbnMoImhhcnZlc3RlZF9hcmVhX29mIikpICU+JSANCiAgICAgICAgICAgICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiY3JvcF90eXBlIiwgdmFsdWVzX3RvID0gImhhcnZlc3RlZF9hcmVhIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNyb3BfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiaGFydmVzdGVkX2FyZWFfb2ZfIiksIA0KICAgICAgICAgICAgICAgICAgICAgY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiX2FjcmVzIikpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNyb3BfdHlwZSA9IHJlY29kZShjcm9wX3R5cGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91bmRfbnV0IiA9ICJncm91bmRudXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW5fZmxvd2VyIiA9ICJzdW5fZmxvd2VyX3NlZWRzIikpLCANCiAgICAgICAgICAgICAgYnkgPSAiY3JvcF90eXBlIikgJT4lIA0KICBtdXRhdGUoYGhhcnZlc3RlZF9hcmVhXyVgID0gcm91bmQoaGFydmVzdGVkX2FyZWEgLyBzdW0oaGFydmVzdGVkX2FyZWEpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIG1hcmdpbl9wZXJfYWNyZSA9IHJvdW5kKG5ldF9tYXJnaW4gLyBoYXJ2ZXN0ZWRfYXJlYSkpICU+JSANCiAgYXJyYW5nZShkZXNjKG1hcmdpbl9wZXJfYWNyZSkpICU+JSANCiAgZmlsdGVyKGhhcnZlc3RlZF9hcmVhID4gNjAwMDAwKSAlPiUgDQogIHJlbmFtZShoYXJ2ZXN0ZWRfYXJlYV9hY3JlcyA9IGhhcnZlc3RlZF9hcmVhLCANCiAgICAgICAgIG5ldF9tYXJnaW5fdXNkID0gbmV0X21hcmdpbiwgDQogICAgICAgICBtYXJnaW5fcGVyX2FjcmVfdXNkID0gbWFyZ2luX3Blcl9hY3JlKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTmV0IG1hcmdpbiBwZXIgYWNyZSBvZiBtYWpvciBjcm9wcyAoMjAxNSkiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBmb290bm90ZSgiRGF0YSBzb3VyY2U6IE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlLCBMaXZlc3RvY2sgYW5kIElycmlnYXRpb24gKDIwMTUvMjAxNikiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNy4yIENvbmZsaWN0IGluZGV4IGFuZCBhZ3JpY3VsdHVyZQ0KDQpDb25mbGljdCBoYXMgYSByZWFsIGVmZmVjdCBvbiBmb29kIHByaWNlcywgYXMgZGVtb25zdHJhdGVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsIEZvb2QgUG9saWN5IFJlc2VhcmNoIEluc3RpdHV0ZSAoSUZQUkkpIGluIHRoZWlyIHdvcmtpbmcgcGFwZXIgW0FncmljdWx0dXJhbCB2YWx1ZSBjaGFpbnMgaW4gYSBmcmFnaWxlIHN0YXRlOiB0aGUgY2FzZSBvZiByaWNlIGluIE15YW5tYXJdKGh0dHBzOi8vd3d3LmlmcHJpLm9yZy9wdWJsaWNhdGlvbi9hZ3JpY3VsdHVyYWwtdmFsdWUtY2hhaW5zLWZyYWdpbGUtc3RhdGUtY2FzZS1yaWNlLW15YW5tYXIpLiBJRlBSSSBub3RlZCB0aGF0IHdoaWxzdCBuZWl0aGVyIHBhZGR5IG5vciBtaWxsZWQgcmljZSBoYWQgbm90IHNlZW4gYW55IG1ham9yIHByaWNlIGNoYW5nZXMgYWZ0ZXIgdGhlIGNvdXAsIHRoZSByZXRhaWwgcHJpY2Ugb2YgcmljZSBoYXMgYmVlbiBub3RpY2VhYmx5IGhpZ2hlciBzaW5jZSB0aGUgY291cC4gVGhpcyBpcyBpbiBsaW5lIHdpdGggYSBzdGVlcCBpbmNyZWFzZSBpbiBmb29kIHZlbmRvcnMgc3VydmV5ZWQgZXhwZXJpZW5jaW5nICJsb2NhbCBmYXJtZXIgc3VwcGx5IGRpZmZpY3VsdGllcyIgYW5kICJvdXRzaWRlIHZpbGxhZ2Ugc3VwcGx5IGRpZmZpY3VsdGllcy4gDQoNCkFsbCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb25mbGljdCBoYXMgYmVlbiBpbXBhY3RpbmcgYWdyaWN1bHR1cmFsIHN1cHBseSBjaGFpbnMgYW5kIHByaWNlcyAtLSBhbiAxMSUgaW5jcmVhc2UgaW4gdGhlIHJldGFpbCBwcmljZXMgb2YgcmljZSB3ZXJlIG5vdGVkIGFmdGVyIHRoZSBjb3VwLiBJRlBSSSBub3RlZCB0aGF0ICJhbiBhZGRpdGlvbmFsIDEwIHZpb2xlbnQgZXZlbnRzIGluIHRoZSBtb250aC1vZiBhbmQgbW9udGggYmVmb3JlIHByaWNlIG1lYXN1cmVtZW50IHdhcyBhc3NvY2lhdGVkIHdpdGggYSAxIGFuZCAyIHBlcmNlbnQgaW5jcmVhc2UgaW4gcHJpY2UgZGlzcGVyc2lvbiBhdCB0aGUgbWlsbCBhbmQgdmVuZG9yIGxldmVscyBbLi4uXSB0aGUgaW1wYWN0IG9mIDEwIHZpb2xlbnQgZXZlbnRzIGlzIGFwcHJveGltYXRlbHkgZXF1aXZhbGVudCB0byBhIDE2Ny0zMzMga20gb2YgZGlzdGFuY2UgYmV0d2VlbiBtaWxscyBhbmQgdmVuZG9ycy4iIA0KDQpJbiBsaWdodCBvZiB0aGVzZSBmaW5kaW5ncywgdGhlIEZTQyB2aXN1YWxpc2VzIGJlbG93IHRoZSBpbnRlcnNlY3Rpb24gb2YgYWNyZXMgb2YgbGFuZCBzb3duIGFuZCB0aGUgbmV3bHktcmVjYWxjdWxhdGVkIGNvbmZsaWN0IGluZGV4LiBUaGUgdHJlZW1hcCBiZWxvdyBzaG93cyAqKnRvd25zaGlwcyoqIGFjY29yZGluZyB0byB0aGVpciBzdGF0ZS9yZWdpb24gYW5kIHRoZSB0b3RhbCBhcmVhIHNvd24gaW4gdGhlbSAoc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlKSBhbmQgdGhlIHNldmVyaXR5IG9mIGNvbmZsaWN0IChjb2xvdXIpLiAgDQoNClRvIGVuc3VyZSBmb29kIHNlY3VyaXR5IGluIFNhZ2FpbmcsIE1hZ3dheSwgTWFuZGFsYXksIE1vbiwgS2F5aW4sIEthY2hpbiBhbmQgS2F5YWgsIGxpdmVsaWhvb2QgcHJvZ3JhbW1pbmcgc2hvdWxkIGJlIHByZWRpY2F0ZWQgb24gc2FmZSBhY2Nlc3MgdG8gYWdyaWN1bHR1cmFsIGxhbmQgYW5kIG1hcmtldHMuIEEgbW9yZSB0aG9yb3VnaCBhbmFseXNpcyBvZiBtYXJrZXQgYWNjZXNzIGluIHRoZXNlIGFyZWFzIGlzIHdhcnJhbnRlZDsgZmFjaWxpdGF0aW5nIGFjY2VzcyBiZXR3ZWVuIHByb2R1Y2VycywgbWlsbGVycyBhbmQgdmVuZG9ycyBpbiB0aGVzZSBhcmVhcyB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIHN0YWJpbGlzYXRpb24gb2YgcHJpY2VzLiBUaGVyZSBpcyBhbHNvIHRoZSBuZWNlc3NpdHkgZm9yIG1pbmUtcmlzayBlZHVjYXRpb24gYXMgbWFueSBhcmVhcyBtaWdodCBiZSBjb250YW1pbmF0ZWQgYnkgVVhPcyAoc2VlIHRoZSBHSUYgaW4gc2VjdGlvbiBbMy40XShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8jcHJvZ3Jlc3Npb24tb2YtY29uZmxpY3QtZXZlbnRzLWJ5LWV2ZW50LXR5cGUtaW4tMjAyMSkgdG8gc2VlIHdoZXJlIGV4cGxvc2lvbnMgYW5kIHJlbW90ZSB2aW9sZW5jZSBoYXZlIG9jY3VycmVkKS4gDQoNCkFncmljdWx0dXJhbCBhcmVhcyBpbiBBeWV5YXJ3YWR5LCBCYWdvLCBZYW5nb24sIFJha2hpbmUgYW5kIFNoYW4gKEVhc3QpIGhhdmUgYmVlbiBsZXNzIGFmZmVjdGVkIGJ5IGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcywgaW5kaWNhdGluZyB0aGF0IGFjY2VzcyB0byBmaWVsZHMgYW5kIG1hcmtldHMgbm90IGJlZW4gZGlzcnVwdGVkIGFuZCBleGlzdGluZyBsaXZlbGlob29kcyBwcm9ncmFtbWUgZGVzaWducyBtYXkgYmUgc3VmZmljaWVudCBpbiB0aGVzZSBhcmVhcy4gDQoNCjxicj4gDQoNCmBgYHtyIHRyZWVtYXAtY29uZmxpY3Qtc2NvcmUtYXJlYS1zb3dufQ0KdnVsbW1yICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSwgYXJlYV9zb3duID0gYWxsX2FyZWFfc293ZWRfbWFsaSkgJT4lIA0KICBsZWZ0X2pvaW4oY29uZmxpY3Rfc2NvcmUgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KHNjb3JlX2ksIGFkbWluM19wY29kZSwgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIA0KICAgICAgICAgICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBmYXRhbGl0aWVzKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSBzZWxlY3Qoc3RhdGVfbmFtZSwgdG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUoc2NvcmVfaSA9IHJlcGxhY2VfbmEoc2NvcmVfaSwgMCkpICU+JSANCiAgZ2dwbG90KGFlcyhhcmVhID0gYXJlYV9zb3duLCBmaWxsID0gc2NvcmVfaSwgc3ViZ3JvdXAgPSBzdGF0ZV9uYW1lLCANCiAgICAgICAgICAgICAjIHRoZXNlIG5leHQgYXJndW1lbnRzIGFyZSB1bm5lY2Vzc2FyeSBhcyB0aGUgZ2dwbG90bHkgZG9lc24ndCB3b3JrIGZvciB0cmVlbWFwcyANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwX25hbWUsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9uYW1lLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZWFfc293bjogIiwgYXJlYV9zb3duLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmF0dGxlczogIiwgYmF0dGxlcywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBsb3Npb25zJiByZW1vdGUgdmlvbGVuY2U6ICIsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zOiAiLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykpKSArDQogIGdlb21fdHJlZW1hcCgpICsNCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX3RleHQocGxhY2UgPSAiY2VudHJlIiwgZ3JvdyA9IFRSVUUsIGFscGhhID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBmb250ZmFjZSA9ICJpdGFsaWMiKSArDQogIGdlb21fdHJlZW1hcF9zdWJncm91cF9ib3JkZXIoY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWdtYSIsIGRpcmVjdGlvbiA9IC0xKSArDQogIGxhYnMoZmlsbCA9ICJjb25mbGljdFxuc2NvcmUiLCANCiAgICAgICB0aXRsZSA9ICJUcmVlbWFwIG9mIHRvd25zaGlwcyBieSBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29sb3VycyBpbmRpY2F0ZSBjb25mbGljdCBzY29yZTsgYXJlYXMgb2YgZWFjaCBzcXVhcmUgY29ycmVzcG9uZCB0byBhY3JlcyBzb3duIGJ5IHRvd25zaGlwIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQsIGFjbGVkZGF0YS5jb20gKDIwMjEpOyBNaW5pc3RyeSBvZiBBZ3JpY3VsdHVyZSBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgbmV4dCB0cmVlbWFwIHVzZXMgdGhlIHNhbWUgYXJlYSBzY2FsZSBhcyB0aGUgb25lIGFib3ZlICh3aGVyZSB0aGUgc2l6ZSBjb3JyZXNwb25kcyB0byB0aGUgYWNyZXMgb2YgYWdyaWN1bHR1cmFsIGxhbmQgc293biksIGJ1dCB0aGUgY29sb3VycyBvZiBlYWNoIHRvd25zaGlwIGhhdmUgYmVlbiByZWNhbGN1bGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmV0IG1hcmdpbnMgdGhhdCB0b3duc2hpcHMgZWFybiBpbiAyMDE1LzIwMTYgZnJvbSBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbi4gSXQgYmVhcnMgbWVudGlvbmluZyBhZ2FpbiB0aGF0IHRoZSBuZXQgbWFyZ2lucyBpbiAyMDE1LzIwMTYgd2VyZSBhbm9tYWxvdXMsIHdpdGggdGhlIGNvdW50cnkgaGF2aW5nIGJlZW4gYWZmZWN0ZWQgYnkgd2lkZXNwcmVhZCBhbmQgc2V2ZXJlIGZsb29kaW5nIGFuZCBsYW5kc2xpZGVzLiANCg0KT2Ygbm90ZSBpcyB0aGF0IGlzIHRoYXQgd2hpbHN0IEF5ZXlhcndhZHkgaGFzIHRoZSBsYXJnZXN0IGN1bHRpdmF0ZWQgYXJlYSBvZiBhbGwgdGhlIHN0YXRlcyBhbmQgcmVnaW9ucywgaXRzIHNoYXJlIG9mIHRoZSBuZXQgbWFyZ2lucyBwZXIgYWNyZSB0ZW5kZWQgdG8gYmUgbG93ZXIgdGhhbiBpbiBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBjb3VudHJ5LiBUaGlzIGlzIGxhcmdlbHkgZHVlIHRvIHRoZSBtdWNoIGhpZ2hlciBsZXZlbHMgb2YgY3JvcCBkaXZlcnNpZmljYXRpb24gaW4gTWFnd2F5IGFuZCBTYWdhaW5nIG9yIHJhdGhlciwgdGhlIHByZWRvbWluYW5jZSBvZiBwYWRkeSBjdWx0aXZhdGlvbiBpbiBBeWV5YXJ3YWR5LiANCg0KPGJyPg0KDQpgYGB7ciB0cmVlbWFwLWNvbmZsaWN0LXNjb3JlLW5ldF9tYXJnaW59DQp2dWxtbXIgJT4lIHNlbGVjdChhbGxfbmV0X21hcmdpbiA9IGFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QsIGFsbF9hcmVhX2hhcnZlc3RlZCA9IGFsbF9hcmVhc19oYXJ2ZXN0ZWRfbWFsaSwgDQogICAgICAgICAgICAgICAgICBhcmVhX3Nvd24gPSBhbGxfYXJlYV9zb3dlZF9tYWxpLCBhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSkgJT4lIA0KICBtdXRhdGUobmV0X21hcmdpbl9hY3JlID0gYWxsX25ldF9tYXJnaW4gLyBhbGxfYXJlYV9oYXJ2ZXN0ZWQpICU+JSANCiAgbGVmdF9qb2luKGNvbmZsaWN0X3Njb3JlICU+JSANCiAgICAgICAgICAgIHNlbGVjdChzY29yZV9pLCBhZG1pbjNfcGNvZGUsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCANCiAgICAgICAgICAgICAgICAgICB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgZmF0YWxpdGllcyksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgc2VsZWN0KHN0YXRlX25hbWUsIHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKHNjb3JlX2kgPSByZXBsYWNlX25hKHNjb3JlX2ksIDApKSAlPiUgDQogIGdncGxvdChhZXMoYXJlYSA9IGFyZWFfc293biwgZmlsbCA9IG5ldF9tYXJnaW5fYWNyZSwgc3ViZ3JvdXAgPSBzdGF0ZV9uYW1lKSkgKw0KICBnZW9tX3RyZWVtYXAoKSArDQogIGdlb21fdHJlZW1hcF9zdWJncm91cF90ZXh0KHBsYWNlID0gImNlbnRyZSIsIGdyb3cgPSBUUlVFLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgZm9udGZhY2UgPSAiaXRhbGljIikgKw0KICBnZW9tX3RyZWVtYXBfc3ViZ3JvdXBfYm9yZGVyKGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgbGFiZWxzID0gY29tbWEpICsNCiAgbGFicyhmaWxsID0gIm5ldCBtYXJnaW5cbnBlciBhY3JlXG4oVVNEKSIsIA0KICAgICAgIHRpdGxlID0gIlRyZWVtYXAgb2YgdG93bnNoaXBzIGJ5IHRvdGFsIG5ldCBtYXJnaW5zIG9mIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29sb3VycyBVU0QgbmV0IG1hcmdpbnMgb2YgYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gYnkgdG93bnNoaXA7XG5BcmVhcyBvZiBlYWNoIHNxdWFyZSBjb3JyZXNwb25kIHRvIGFjcmVzIHNvd24gYnkgdG93bnNoaXAiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRCwgYWNsZWRkYXRhLmNvbSAoMjAyMSk7IE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlIGFuZCBJcnJpZ2F0aW9uICgyMDE1KSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQogIA0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgNy4zIE1hcHMgb2YgY29uZmxpY3QgZXZlbnRzLCBmYXRhbGl0aWVzIGFuZCBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duIA0KDQpDbGljayAqKltoZXJlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9hY2xlZF9tYXBzLykqKiB0byBzZWUgaW50ZXJhY3RpdmUgdmVyc2lvbnMgb2YgdGhlc2UgbWFwcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBtYXBzIGFyZSBxdWl0ZSBsYXJnZSBhbmQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIGxvYWQuIFN0YXRpYyB2ZXJzaW9ucyBhcmUgZm91bmQgYmVsb3cuIA0KDQpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIHBhdGNod29yay1hZy1jb25mbGljdC1tYXBzfQ0KDQphZ19tYWxpICU+JSANCiAgZ3JvdXBfYnkodG93bnNoaXBfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGFyZWFfc293biA9IG1lYW4oYWxsX2FyZWFfc293ZWRfbWFsaSkpICU+JSANCiAgc2VsZWN0KGFyZWFfc293biwgYWRtaW4zX3Bjb2RlID0gdG93bnNoaXBfcGNvZGUpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYXJlYV9zb3duKSwgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gYWNsZWQgJT4lIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChsYXRpdHVkZSwgbG9uZ2l0dWRlLCBmYXRhbGl0aWVzKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGZhdGFsaXRpZXMpLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gInJlZCIpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmxhY2siKSkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwgMS41KSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hLCBicmVha3MgPSBjKDAsIDUwMDAwLCAyMDAwMDAsIDQwMDAwMCwgNjAwMDAwLCA3NTAwMDApKSArIA0KICBndWlkZXMoc2l6ZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAic293biBhcmVhIChhY3JlcykiLCANCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgKDIwMjEpIGFuZCBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duICgyMDE1KSIsDQogICAgICAgY2FwdGlvbiA9ICJBQ0xFRDsgYWNsZWRkYXRhLmNvbSAmIE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlIGFuZCBJcnJpZ2F0aW9uIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgDQpjb25mbGljdF9zY29yZSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCB0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShzY29yZV9pID0gcm91bmQoc2NvcmVfaSwgZGlnaXRzID0gMikpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICBzdF9hc19zZigpICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBzY29yZV9pKSwgc2l6ZSA9IDAuMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1hZ21hIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJDb25mbGljdCBzY29yZSIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA4LiBUZXh0IG1pbmluZyB0aGUgQUNMRUQgZGF0YXNldA0KDQojIyMgOC4xIE5ldHdvcmsgZ3JhcGggb2YgY29ycmVsYXRlZCB3b3Jkcw0KDQpUaGlzIGNoYXB0ZXIgZm9jdXNlcyBvbiBkYXRhIG1pbmluZyB0aGUgdGV4dCB3aXRoaW4gdGhlIGNvbHVtbiAqKmBub3Rlc2AqKiBvZiB0aGUgQUNMRUQgZGF0YXNldCwgd2hpY2ggY29udGFpbnMgYSBkZXNjcmlwdGlvbnMgb2YgZWFjaCBjb25mbGljdCBldmVudC4gRm9yIHRoaXMgZmlyc3Qgc2VjdGlvbiwgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBjb25mbGljdCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIHByZXNlbnRlZCBpbiBhIG5ldHdvcmsgZ3JhcGguIEVhY2ggd29yZCBpcyBhIG5vZGUgYW5kIHRoZSBvcGFjaXR5IG9mIHRoZSBsaW5lIGRlbm90ZXMgdGhlIHN0cmVuZ3RoIG9mIGl0cyBjb3JyZWxhdGlvbiB0byBvdGhlciB3b3JkcyAodGhhdCBpcywgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhleSBoYXZlIGJlZW4gdXNlZCB0byBkZXNjcmliZSB0aGUgc2FtZSBjb25mbGljdCBldmVudCkuIE9ubHkgd29yZHMgdGhhdCBoYXZlIGFwcGVhcmVkIG1vcmUgdGhhbiA3MCB0aW1lcyBpbiB0aGUgZGF0YXNldCBhcmUgc2hvd246IA0KDQo8YnI+DQoNClshW2NvbmZsaWN0IG5ldHdvcmsgZ3JhcGhdKGNvbmZsaWN0X25ldHdvcmtfZ3JhcGgucG5nKV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjL21hc3Rlci9jb25mbGljdF9uZXR3b3JrX21hcC5wbmcpe3RhcmdldD0iX2JsYW5rIn0NCmNsaWNrICoqW2hlcmVdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy9tYXN0ZXIvY29uZmxpY3RfbmV0d29ya19tYXAucG5nKXt0YXJnZXQ9Il9ibGFuayJ9KiogdG8gc2VlIHRoZSBmdWxsLXNpemVkIGdyYXBoLiANCg0KPGJyPg0KDQpUaGUgZmlyc3QgY2x1c3RlciBvZiBub3RlIGlzIGFyb3VuZCB0aGUgd29yZCAicHJvdGVzdHMiLCB0aGVzZSBhcmUgbGlua2VkIHRvIHdvcmRzIHN1Y2ggYXMgImNvdXAiIGFuZCAiZGlzb2JlZGllbmNlIjsgIGJlbG93IGl0IGlzIGFub3RoZXIgY2xvc2VseS1yZWxhdGVkIGNsdXN0ZXIgY29udGFpbmluZyB0aGUgd29yZHMgImxpdmUiLCAicnViYmVyIiwgImJ1bGxldHMiLCAiZGlzcGVyc2UiIGFuZCAiY3Jvd2QiLiBJdCBjYW4gYmUgZmFpcmx5IGVhc2lseSBzdXJtaXNlZCB0aGF0IHRoZXNlIHdvcmRzIGFyZSByZWxhdGVkIHRvIGNvbmZsaWN0IGV2ZW50cyBzdXJyb3VuZGluZyB0aGUgRmVicnVhcnkgMjAyMSBjb3VwIGFuZCB0aGUgbWFzcyBkZW1vbnN0cmF0aW9ucyBpbiByZXNwb25zZSB0byBpdCAtLSB0aGUgd29yZCAiRmVicnVhcnkiIGlzIGFsc28gY2xvc2VseSBsaW5rZWQgd2l0aCB0aGVzZSBjbHVzdGVycy4gDQoNCkFub3RoZXIgY2x1c3RlciBvZiBub3RlIGNlbnRyZXMgYXJvdW5kIHRoZSB3b3JkcyAicmVtb3RlIiwgImNvbnRyb2xsZWQiIGFuZCAiZXhwbG9zaXZlcyIsIGFuZCBpcyBjbG9zZWx5IGxpbmtlZCB0byB0aGUgd29yZHMgImNvbnZveSIsICJ0cnVja3MiIGFuZCAibGFuZG1pbmVzIiAtLS0gdGhlc2Ugd29yZHMgYXJlIGxpa2VseSBsaW5rZWQgdG8gZXZlbnRzIHdoZXJlIG1pbGl0YXJ5IGNvbnZveXMgd2VyZSBib21iZWQgYW5kIGFtYnVzaGVkIGJ5IFBlb3BsZSdzIERlZmVuY2UgRm9yY2VzLiANCg0KVGhlcmUgaXMgYWxzbyB0aGUgS2FjaGluIGNsdXN0ZXIsIGNlbnRyZWQgYXJvdW5kICJNeWl0a3lpbmEiLCAiV2FpbmdtYXciLCAiTW9uaHlpbiIsICJIcGFrYW50IiwgIkJoYW1vIiBhbmQgdGhlICJLSUEiLCB0aGUgS2FjaGluIEluZGVwZW5kZW5jZSBBcm15LiBOb3RpY2VhYmx5LCB0aGlzIGNsdXN0ZXIgYWxzbyBoYXMgbGlua3Mgd2l0aCB0aGUgd29yZHMgImJhdHRhbGlvbiIgYW5kICJqZXQiIGFuZCAiZmlnaHRlcnMiLiANCg0KVGhpcyBuZXR3b3JrIGdyYXBoIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhbiBleGhhdXN0aXZlIHJlY29yZCBvZiB0aGUgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEgYW5kIG1lcmVseSBpbnRlbmRzIHRvIHByb3ZpZGUgYW4gb3ZlcnZpZXc6IG9ubHkgd29yZHMgd2hpY2ggYXBwZWFyZWQgbW9yZSB0aGFuIDcwIHRpbWVzIGluIHRoZSBBQ0xFRCBkYXRhc2V0IGFuZCBoYWQgYSBjb3JyZWxhdGlvbiBvZiAwLjIgb3IgbW9yZSB3ZXJlIGluY2x1ZGVkLiBUaGUgaW5jbHVzaW9uIG9mIHdvcmRzIHdpdGggdG9vIGZldyBvY2N1cnJlbmNlcyBtaWdodCBhbHNvIGluY2x1ZGUgdGhvc2Ugd2l0aCBzcHVyaW91cyBjb3JyZWxhdGlvbnM7YnV0IHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgZ3JhcGggd2FzIGFsc28gYSBmYWN0b3IuIENsaWNrIG9uIHRoZSBsaW5rIHRvIHNlZSB0aGUgZ3JhcGggYXQgZnVsbC1zaXplIGFuZCBleHBsb3JlIGl0IGZ1cnRoZXIuIA0KDQpBcyBhIG1pbm9yIGFkZGVuZHVtIHRvIHRoZSBuZXR3b3JrIGdyYXBoLCB0aGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgdG9wIDIwIHdvcmRzIG1vc3QgbGlrZWx5IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHR5cGUgb2YgY29uZmxpY3QgZXZlbnQuIEZvciBpbnN0YW5jZSwgdGhlIHdvcmQgImNsYXNoZWQiIGlzIG1vc3QgbGlrZWx5IHRvIGFwcGVhciBpbiB0aGUgZGVzY3JpcHRpb25zIG9mIGJhdHRsZXMgdGhhbiBhbnkgb2YgdGhlIG90aGVyIGV2ZW50IHR5cGVzLiANCg0KPGJyPg0KDQpgYGB7ciBmYWNldC1sb2ctb2Rkcy1ldmVudC10eXBlLCBmaWcuaGVpZ2h0PTYuNX0NCmFjbGVkX3dvcmRzICU+JQ0KICBmaWx0ZXIod29yZCAlb3V0JSBjKCJmYXRhbGl0eSIsICJjb2RlZCIsICJkZWF0aCIsICJ2aWxsYWdlIiwgInRvd25zaGlwIiwgImRpc3RyaWN0IiwgInZpbGxhZ2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAidG93biIsICJ0cmFjdCIsICJmYXRhbGl0aWVzIiwgImR2YiIsICJhYXBwIiwgInRvdGFsIiwgImlycmF3YWRkeSIsICJyZmEiLCAiZGllZCIsDQogICAgICAgICAgICAgICAgICAgICAgImtpbGxpbmciLCAia2lsbGVkIiwgImRlYWQiLCAiZXZlbnQiLCAiZXZlbnRzIiwgImNhc3VhbHR5IiwgImNhc3VhbHRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICJzaXplIiwgImNvZGUiLCAicmVwb3J0IiwgIm15YW5tYXIiLCJjb2RlZCIpKSAlPiUgDQogIG11dGF0ZShoYXNfZmF0YWxpdGllcyA9IGlmZWxzZShmYXRhbGl0aWVzID4gMCwgInllcyIsICJubyIpKSAlPiUgDQogIGNvdW50KGV2ZW50X3R5cGUsIHdvcmQpICU+JSANCiAgYmluZF9sb2dfb2RkcyhldmVudF90eXBlLCB3b3JkLCBuKSAlPiUgDQogIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiAgdG9wX24oMjAsIGxvZ19vZGRzX3dlaWdodGVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcl93aXRoaW4od29yZCwgbG9nX29kZHNfd2VpZ2h0ZWQsIGV2ZW50X3R5cGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGxvZ19vZGRzX3dlaWdodGVkLCB5ID0gd29yZCwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeV9yZW9yZGVyZWQoKSArDQogIGZhY2V0X3dyYXAofiBldmVudF90eXBlLCBzY2FsZXMgPSAiZnJlZSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHRpdGxlID0gIlRvcCAyMCB3b3JkcyBieSBldmVudCB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJPZGRzIG9mIHdvcmRzIHVzZWQgdG8gZGVzY3JpYmUgY29uZmxpY3QgZXZlbnRzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgDQogICAgICAgeSA9ICIiKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDguMiBQYWlyd2lzZSBjb3JyZWxhdGlvbnMgDQoNClRvIGNvbXBsZW1lbnQgdGhlIG5ldHdvcmsgZ3JhcGggYWJvdmUsIHRoZSB0YWJsZSBiZWxvdyBzaG93cyBjb3JyZWxhdGlvbnMgYmV0d2VlbiBpbmRpdmlkdWFsIHdvcmRzIGluIHRoZSBBQ0xFRCBkYXRhc2V0IGNvbmZsaWN0IGRlc2NyaXB0aW9ucyAodGhhdCBpcywgaG93IG9mdGVuIHRoZXkgd2VyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzYW1lIGV2ZW50KSAtLSB0aGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHRoZXJlIGlzIGEgd29yZCBvZiBpbnRlcmVzdCB0aGF0IHRoZSByZWFkZXIgd291bGQgbGlrZSB0byBleHBsb3JlIGluIGZ1cnRoZXIgZGV0YWlsLiBUbyByZWR1Y2UgdGhlIHNpemUgb2YgdGFibGUgbG9hZGVkLCBvbmx5IHdvcmRzIHdoaWNoIGhhdmUgYXBwZWFyZWQgbW9yZSB0aGFuIDUwIHRpbWVzIGluIDIwMjEgYW5kIG9ubHkgdGhlIHRvcCAyMCBtYXRjaGVzIHBlciB3b3JkIGhhdmUgYmVlbiBpbmNsdWRlZC4gQSBjb3JyZWxhdGlvbiBvZiAxIG1lYW5zIHRoYXQgdGhlIHdvcmQgYWx3YXlzIGFwcGVhcnMgd2l0aCBpdHMgbWF0Y2ggaW4gdGhlIGRhdGFzZXQ7IGEgY29ycmVsYXRpb24gb2YgMC41IG1lYW5zIHRoYXQgdGhlIHdvcmQgYXBwZWFycyBpbiB0aGUgc2FtZSBldmVudCBhcyBpdHMgbWF0Y2ggNTAlIG9mIHRoZSB0aW1lLiANCg0KVXNlIHRoZSBmaWx0ZXIgYWJvdmUgdGhlIGNvbHVtbiAqKmB3b3JkYCoqIHRvIHRyeSBvdXQgZGlmZmVyZW50IHdvcmRzIC0tIHRyeSBzdGFydGluZyB3aXRoICJhcnRpbGxlcnkiLCAicHJvdGVzdCIsICJsYW5kbWluZSIgb3IgYSBsb2NhdGlvbiBvZiBpbnRlcmVzdC4gQWxsIHdvcmRzIGFyZSBpbiBsb3dlciBjYXNlLiBUaGUgc2VhcmNoIGJhciB3aWxsIGxvb2sgaW4gYm90aCBjb2x1bW5zIGFuZCBtYXkgcHJvdmUgbGVzcyB1c2VmdWwgdGhhbiB0aGUgZmlsdGVyIGJhci4gDQoNCjxicj4NCg0KYGBge3IgZHQtcGFpcndpc2Utd29yZHN9DQphY2xlZF93b3JkcyAlPiUgIA0KICBmaWx0ZXIod29yZCAlb3V0JSBjKCJ0b3duc2hpcCIsICJkaXN0cmljdCIsICJteWFubWFyIiwgInJlZ2lvbiIsICJ2aWxsYWdlIiwgInRvd24iLCAic2l6ZSIsICJyZXBvcnQiLCAiY29kZSIsICJjb2RlZCIsDQogICAgICAgICAgICAgICAgICAgICAgImR2YiIsICJhYXBwIiwgInJmYSIsICJpcnJhd2FkZHkiKSkgJT4lIA0KICBkaXN0aW5jdChkYXRhX2lkLCB3b3JkKSAlPiUgDQogIGFkZF9jb3VudCh3b3JkKSAlPiUgDQogIGZpbHRlcihuID49IDUwKSAlPiUgDQogIHBhaXJ3aXNlX2Nvcih3b3JkLCBkYXRhX2lkLCBzb3J0ID0gVFJVRSkgJT4lDQogIHJlbmFtZSh3b3JkID0gaXRlbTEsIG1hdGNoID0gaXRlbTIpICU+JSANCiAgZ3JvdXBfYnkod29yZCkgJT4lIA0KICB0b3Bfbihjb3JyZWxhdGlvbiwgbiA9IDIwKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLCANCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggPSBsaXN0KHJlZ2V4ID0gVFJVRSkNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb21wbGV0ZSA9IGh0bWx3aWRnZXRzOjpKUygNCiAgIyAgICAgICAgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgIyAgICAgICAgcGFzdGUwKCIkKHRoaXMuYXBpKCkudGFibGUoKS5jb250YWluZXIoKSkuY3NzKHsnZm9udC1zaXplJzogJyIsICI4LjVwdCIsICInfSk7IiksDQogICMgICAgICAgICJ9IikNCiAgICAgICApLA0KICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTQwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYWlyd2lzZSBjb3JyZWxhdGlvbnMgaW4gY29uZmxpY3QgZXZlbnQgZGVzY3JpcHRpb25zIikNCiAgICAgKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImNvcnJlbGF0aW9uIiksIGRpZ2l0cyA9IDMpDQoNCmBgYA0KDQo8YnI+DQoNCkFzIGEgbWlub3IgYWRkZW5kdW0sIGJlbG93IGlzIGEgcGxvdCBvZiB0aGUgdG9wIDMwIHdvcmRzIGFzc29jaWF0ZWQgd2l0aCBjb25mbGljdCBldmVudHMgdGhhdCByZXN1bHRlZCBpbiBmYXRhbGl0aWVzICgieWVzIiwgaW4gcmVkKSBhbmQgdGhvc2UgdGhhdCBkaWQgbm90ICgibm8iLCBpbiBibHVlKS4gVGhleSBhcmUgcmFua2VkIGJlbG93IGluIG9yZGVyIG9mIHRoZWlyIG9kZHMgb2YgYmVpbmcgZGVzY3JpYmVkIGNvbmZsaWN0IGV2ZW50cyB0aGF0IGRpZCBhbmQgZGlkIG5vdCByZXN1bHQgaW4gZmF0YWxpdGllcyAtLSB3aXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBiZWxvdywgdGhlIHdvcmRzICJzaG90IiwgInNvbGRpZXJzIiwgImluanVyZWQiLCAiUERGIiBhbmQgIm1pbGl0YXJ5IGFyZSB0aGUgbW9zdCBsaWtlbHkgdG8gYmUgYmUgdXNlZCBpbiBkZXNjcmlwdGlvbnMgb2YgY29uZmxpY3QgZXZlbnRzIHRoYXQgcmVzdWx0ZWQgaW4gZmF0YWxpdGllcy4gVGhlIHdvcmRzICJkaXNwbGFjZW1lbnQiLCAiY2hhbmdlIiwgImZvcm1lZCIsICJhcnJlc3RlZCIgYW5kICJvZmZpY2VzIiB3ZXJlIGxlYXN0IGxpa2VseSB0byBiZSB1c2VkIHRvIGRlc2NyaWJlIGV2ZW50cyB0aGF0IHJlc3VsdGVkIGluIGZhdGFsaXRpZXMuIA0KDQpBbiBpbnRlcmVzdGluZyBuZXh0IHN0ZXAgbWlnaHQgYmUgdG8gdHJ5IGFuZCBkZXZlbG9wIGEgcHJlZGljdGl2ZSBtb2RlbCBiYXNlZCBvbiB0aGUgdmFyaW91cyBjb25mbGljdCBkZXNjcmlwdGlvbnMgdG8gdW5kZXJzdGFuZCB3aGljaCB0eXBlcyBvZiBldmVudHMgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBjb25mbGljdCBmYXRhbGl0aWVzLiANCg0KPGJyPg0KDQpgYGB7ciBmYWNldF9oYXNfZmF0YWxpdGllcywgZmlnLmhlaWdodCA9IDZ9DQphY2xlZF93b3JkcyAlPiUNCiAgZmlsdGVyKHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICBmaWx0ZXIod29yZCAlb3V0JSBjKCJmYXRhbGl0eSIsICJjb2RlZCIsICJkZWF0aCIsICJ2aWxsYWdlIiwgInRvd25zaGlwIiwgImRpc3RyaWN0IiwgInZpbGxhZ2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAidG93biIsICJ0cmFjdCIsICJmYXRhbGl0aWVzIiwgImR2YiIsICJhYXBwIiwgInRvdGFsIiwgImlycmF3YWRkeSIsICJyZmEiLCAiZGllZCIsDQogICAgICAgICAgICAgICAgICAgICAgImtpbGxpbmciLCAia2lsbGVkIiwgImRlYWQiLCAiZXZlbnQiLCAiZXZlbnRzIiwgImNhc3VhbHR5IiwgImNhc3VhbHRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICJzaXplIiwgImNvZGUiLCAicmVwb3J0IiwgIm15YW5tYXIiLCJjb2RlZCIpKSAlPiUgDQogIG11dGF0ZShoYXNfZmF0YWxpdGllcyA9IGlmZWxzZShmYXRhbGl0aWVzID4gMCwgInllcyIsICJubyIpLA0KICAgICAgICAgaGFzX2ZhdGFsaXRpZXMgPSBmY3RfcmV2KGhhc19mYXRhbGl0aWVzKSkgJT4lIA0KICBjb3VudChoYXNfZmF0YWxpdGllcywgd29yZCkgJT4lIA0KICBiaW5kX2xvZ19vZGRzKGhhc19mYXRhbGl0aWVzLCB3b3JkLCBuKSAlPiUgDQogIGdyb3VwX2J5KGhhc19mYXRhbGl0aWVzKSAlPiUgDQogIHRvcF9uKDMwLCBsb2dfb2Rkc193ZWlnaHRlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUod29yZCA9IHJlb3JkZXJfd2l0aGluKHdvcmQsIGxvZ19vZGRzX3dlaWdodGVkLCBoYXNfZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbG9nX29kZHNfd2VpZ2h0ZWQsIHkgPSB3b3JkLCBmaWxsID0gaGFzX2ZhdGFsaXRpZXMpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeV9yZW9yZGVyZWQoKSArDQogIGZhY2V0X3dyYXAofiBoYXNfZmF0YWxpdGllcywgc2NhbGVzID0gImZyZWUiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJUb3AgMzAgd29yZHMgYnkgd2hldGhlciB0aGUgZXZlbnQgcmVzdWx0ZWQgaW4gZmF0YWxpdGllcyIsDQogICAgICAgc3VidGl0bGUgPSAiT2RkcyBvZiB3b3JkcyB1c2VkIHRvIGRlc2NyaWJlIGNvbmZsaWN0IGV2ZW50cyB3aXRoIGFuZCB3aXRob3V0IGZhdGFsaXRpZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgIHkgPSAiIikNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA4LjMgU291cmNlcyB1c2VkIGJ5IHRoZSBBQ0xFRCBkYXRhc2V0DQoNCg0KYGBge3Igc291cmNlcy1kZn0NCg0KYWNsZWRfc291cmNlIDwtIGFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBzZXBhcmF0ZShzb3VyY2UsIHNlcCA9ICI7ICIsIGludG8gPSBwYXN0ZSgidiIsIDE6NCwgc2VwID0gIl8iKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGModl8xOnZfNCksIG5hbWVzX3RvID0gImlnbm9yZSIsIHZhbHVlc190byA9ICJzb3VyY2VfbG9uZyIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShzb3VyY2VfbG9uZykpDQoNCmBgYA0KDQpBcyBtZW50aW9uZWQsIHRoZXNlIHdvcmRzIG9yaWdpbmF0ZSBmcm9tIHRoZSBBQ0xFRCBkYXRhc2V0J3MgZGVzY3JpcHRpb25zIG9mIGVhY2ggY29uZmxpY3QgZXZlbnQuIEluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzLCB0aGVzZSBjb25mbGljdCBkZXNjcmlwdGlvbnMgYXJlIGFydGljbGVzIGZyb20gdmFyaW91cyBuZXdzIHNvdXJjZXMuIA0KDQpBIHRvdGFsIG9mIGByIGFjbGVkX3NvdXJjZSAlPiUgZGlzdGluY3Qoc291cmNlX2xvbmcpICU+JSBucm93YCBuZXdzIHNvdXJjZXMgd2VyZSB1c2VkIGluIHRoZSBBQ0xFRCBkYXRhc2V0LiBBYm91dCBhIHRoaXJkIG9mIHRoZSBjb25mbGljdCBldmVudHMgaW4gMjAyMSBpbmNsdWRlZCBpbiB0aGUgQUNMRUQgZGF0YXNldCB3ZXJlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgaW4gdGhlIFtEZW1vY3JhdGljIFZvaWNlIG9mIEJ1cm1hXShodHRwczovL2VuZ2xpc2guZHZiLm5vLykuIFRvIGFzc2VzcyB0aGUgY29tcGxldGVuZXNzIGFuZCByZWxpYWJpbGl0eSBvZiB0aGUgQUNMRUQgZGF0YXNldCwgYSBtb3JlIHRob3JvdWdoIGFuYWx5c2lzIG9mIHRoZSBuZXdzIHNvdXJjZXMgaXQgbWFrZXMgdXNlIG9mIHNob3VsZCBiZSBjb25kdWN0ZWQuIEFkZGl0aW9uYWxseSwgY29tcGFyaXNvbnMgc2hvdWxkIGJlIG1hZGUgYmV0d2VlbiBBQ0xFRCdzIG1ldGhvZG9sb2d5IGFuZCB0aGF0IG9mIHRoZSBOZXh1cyBSZXNwb25zZSBNZWNoYW5pc20uIFRoZSBtb3N0IGNvbW1vbiBuZXdzIHNvdXJjZXMgYXJlIGxpc3RlZCBpbiB0aGUgcGxvdCBiZWxvdywgaW4gb3JkZXIgb2YgdGhlIHNoYXJlIG9mIDIwMjEgY29uZmxpY3QgZXZlbnRzIGF0dHJpYnV0ZWQgdG8gdGhlbS4gDQoNCjxicj4NCg0KYGBge3Igc291cmNlcy1iYXJwbG90fQ0KDQphY2xlZF9zb3VyY2UgJT4lIA0KICBtdXRhdGUoc291cmNlX2xvbmcgPSBmY3RfbHVtcChzb3VyY2VfbG9uZyAlPiUgYXMuZmFjdG9yLCBuPTIwKSkgJT4lIA0KICBjb3VudChzb3VyY2VfbG9uZywgc29ydCA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHNvdXJjZV9sb25nID0gZmN0X3Jlb3JkZXIoc291cmNlX2xvbmcsIG4pLCANCiAgICAgICAgIHBjX29mX3RvdGFsID0gbiAvIHN1bShuKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwY19vZl90b3RhbCwgeSA9IHNvdXJjZV9sb25nLCBmaWxsID0gc291cmNlX2xvbmcpKSArDQogIGdlb21fY29sKCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGJyZWFrcyA9IHNlcSgwLCAwLjM4LCBieSA9IDAuMDUpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgbGFicyh4ID0gIlBlcmNlbnRhZ2Ugb2YgY29uZmxpY3QgZXZlbnRzIHJlcG9ydGVkIGJ5IHNvdXJjZSIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTW9zdCBjb21tb24gZGF0YSBzb3VyY2VzIGluIDIwMjEgaW4gdGhlIEFDTEVEIGRhdGFzZXQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2VzIG91dHNpZGUgb2YgdGhlIHRvcCAyMCB3ZXJlIHJlY29kZWQgYXMgJ090aGVyJyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KICAgICAgICANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA5LiBOZXh0IHN0ZXBzDQoNCiogUmUtY2FsY3VsYXRlIHRoZSBjb25mbGljdCBzY29yZSBvbmNlIElEUCBkYXRhIGlzIG9idGFpbmVkIGFuZCBjb21wYXJlIHRoZXNlIHJlc3VsdHMgdG8gcHJldmlvdXMgcmVzdWx0cyByZWNvcmRlZCBieSBNSU1VLUhBUlAgaW4gdGhlaXIgdnVsbmVyYWJpbGl0eSBhbmFseXNpcy4gVG8gbm90ZSwgZGlzcGxhY2VtZW50IGlzIGxpa2VseSB0byBiZSBoaWdobHkgY29ycmVsYXRlZCB3aXRoIHRoZSBvdGhlciBjb25mbGljdCBpbmRpY2F0b3JzICh0aGlzIHdhcyB0aGUgY2FzZSB3aXRoIHRoZSBNSU1VLUhBUlAgY29uZmxpY3QgaW5kZXgpLiBOZXZlcnRoZWxlc3MsIGl0IHdhcyBhIGtleSBjb21wb25lbnQgb2YgdGhlIE1JTVUtSEFSUCBtb2RlbCBhbmQgaXRzIGluY2x1c2lvbiB3aWxsIGFpZCBpbiBpbXByb3ZpbmcgY29tcGFyYWJpbGl0eS4gDQoNCiogQ29tcGFyZSB0aGUgY29uZmxpY3Qgc2NvcmUgYW5kIHNwZWNpZmljIGNvbmZsaWN0IGluZGljYXRvcnMgdG8gcmVzdWx0cyBvZiB0aGUgV0ZQLUZBTyBmb29kIGluc2VjdXJpdHkgc3VydmV5LiBJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBhcmUgYW55IHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSB0d28uIEZpbHRlciB0aGUgY29uZmxpY3QgZGF0YSB0byBvbmx5IGluY2x1ZGUgdGltZSBwZXJpb2RzIHJlbGV2YW50IHRvIFdGUC1GQU8ncyBzdHVkeS4gQWRkaXRpb25hbGx5LCBjb25mbGljdCBzY29yZXMgc2hvdWxkIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBtYXJrZXQgcHJpY2VzIHRvIHNlZSBpZiBhIHByZWRpY3RpdmUgbW9kZWwgY2FuIGJlIGVzdGFibGlzaGVkLiBBZGRpdGlvbmFsbHksIGJlZ2luIHRoZSBjb21wYXJpc29uIG9mIGNvbmZsaWN0IGRhdGEgYW5kIGRhdGEgb24gbWFsbnV0cml0aW9uLiBUaGVyZSB3aWxsIGxpa2VseSBiZSBtYW55IGNoYWxsZW5nZXMgaW4gb2J0YWluaW5nIGFjY3VyYXRlIG1vcnRhbGl0eSByYXRlcyBvZiBhbnkga2luZC4gDQoNCiogQ29tcGFyZSBjb25mbGljdCBpbmRpY2F0b3JzIHRvIG1hcmtldCBwcmljZXMgdG8gaWRlbnRpZnkgaWYgYmF0dGxlcyBhbmQgb3RoZXIgdmlvbGVudCBpbmNpZGVudHMgaGF2ZSBoYWQgaW1wYWN0cyBvbiBmb29kIHByaWNlcyBhbmQgdGhlaXIgc3RhYmlsaXR5OyBleHBsb3JlIGlmIGEgcHJlZGljdGl2ZSBtb2RlbCBjYW4gYmUgZGV2ZWxvcGVkLiANCg0KKiBSZXZpZXcgZmluZGluZ3Mgd2l0aCBvdGhlciBodW1hbml0YXJpYW4gc3Rha2Vob2xkZXJzOyBkZXZlbG9wIGFyZWEtc3BlY2lmaWMgcHJvZHVjdHMsIGlmIG5lY2Vzc2FyeS4gSXQgaXMgaW1wb3J0YW50IHRvIHJldmlldyB0aGUgY29uZmxpY3Qgc2NvcmUgd2l0aCBvdGhlciBzdGFrZWhvbGRlcnMgdG8gYXNzZXNzIGFwcGV0aXRlIGZvciBpdHMgYWRvcHRpb24uIE1vc3Qgb2YgdGhlIGRhdGEgdXNlZCBmb3IgaXRzIGdlbmVyYXRpb24gaXMgZWFzaWx5IGFjY2Vzc2libGUgYW5kIHJlZ3VsYXJseSB1cGRhdGVkLCB0aG91Z2ggaXQgcmVtYWlucyB0byBiZSBzZWVuIHRvIHdoYXQgZXh0ZW50IHRoaXMgaXMgdHJ1ZSBmb3IgdGhlIGRhdGEgb24gZGlzcGxhY2VtZW50LiANCg0KKiBDb21wYXJlIEFDTEVEIGRhdGEgYWdhaW5zdCBNSU1VJ3MgaGFyZC10by1yZWFjaCBhcmVhcyBkYXRhc2V0LiANCg0KKiBDcm9zcy1yZWZlcmVuY2UgY29uZmxpY3QgZGF0YSB3aXRoIHBhcnRuZXIgcHJlc2VuY2UgYW5kIGFjaGlldmVtZW50cyBvZiBvdGhlciBjbHVzdGVycy4gDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDEwLiBSZWZlcmVuY2UgbWFwcyBhbmQgdGFibGVzDQoNCg0KIyMjIDEwLjEgQ29uZmxpY3QgZXZlbnRzIGluIDIwMjEgYWdncmVnYXRlZCBhdCB0b3duc2hpcCBsZXZlbCANCg0KYGBge3IgRFQtYnktdG93bnNoaXB9DQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBhZG1pbjMsIGFkbWluM19wY29kZSkgJT4lIA0KICBjb3VudChldmVudF90eXBlKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBldmVudF90eXBlLCB2YWx1ZXNfZnJvbSA9IG4pICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIH4gc3VtKC54LCBuYS5ybSA9IFRSVUUpKSAlPiUgIA0KICBsZWZ0X2pvaW4oYWNsZWQgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICBsZWZ0X2pvaW4oZnNjICU+JSAgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKHVfYmVuKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHBhcnRuZXJzID0gMCwgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogIHNlbGVjdChzdGF0ZSA9IGFkbWluMSwgdG93bnNoaXAgPSBhZG1pbjMsIHRvdGFsX2V2ZW50cywgZmF0YWxpdGllcywgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGUgPSBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcHJvdGVzdHMsDQogICAgICAgICBzdHJhdGVnaWNfZGV2ID0gc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgdmlvbGVuY2VfY2l2aWxpYW5zID0gdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIHJpb3RzLCBwYXJ0bmVycywgDQogICAgICAgICBiZW5lZmljaWFyaWVzLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2V2ZW50cykpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb21wbGV0ZSA9IGh0bWx3aWRnZXRzOjpKUygNCiAgICAgICAgICMgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgICAgICAgICMgcGFzdGUwKCIkKHRoaXMuYXBpKCkudGFibGUoKS5jb250YWluZXIoKSkuY3NzKHsnZm9udC1zaXplJzogJyIsICI4LjVwdCIsICInfSk7IiksDQogICAgICAgICAjICJ9IikpLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTQwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIxIGNvbmZsaWN0IGV2ZW50cyBieSB0b3duc2hpcCIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImJlbmVmaWNpYXJpZXMiKSwgZGlnaXRzID0gMCkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAxMC4yIENvbmZsaWN0IGFjdG9ycyBpbiAyMDIxDQoNCmBgYHtyIERULWNvbmZsaWN0LWFjdG9yc30NCmFjdG9ycyAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBhY3Rvcl90eXBlID0gaW50ZXIxLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGV2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gY291bnQpICU+JSAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4oYWN0b3JzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpLCBieSA9ICJhY3Rvcl9zaW1wbGUiKSAlPiUNCiAgcmVuYW1lKGFjdG9yX25hbWUgPSBhY3Rvcl9zaW1wbGUpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlID0gMCwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgPSAwLCBiYXR0bGVzID0gMCwgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyA9IDAsIA0KICAgICAgICAgICAgICAgICAgcmlvdHMgPSAwLCBwcm90ZXN0cyA9IDApKSAlPiUNCiAgc2VsZWN0KGFjdG9yX25hbWUsIGFjdG9yX3R5cGUsIHRvd25zaGlwcywgZmF0YWxpdGllcywgdG90YWxfZXZlbnRzLCBiYXR0bGVzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHJpb3RzLA0KICAgICAgICAgcHJvdGVzdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2V2ZW50cykpICU+JQ0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUNCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgIyAiZnVuY3Rpb24oc2V0dGluZ3MsIGpzb24pIHsiLA0KICAgICAgICAgIyBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICMgIn0iKSksDQogICAgICAgICAgICApLA0KICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZToxNDAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjEgY29uZmxpY3QgYWN0b3JzIikpICU+JQ0KICBmb3JtYXRSb3VuZChjKCJmYXRhbGl0aWVzIiwgInRvdGFsX2V2ZW50cyIsICJiYXR0bGVzIiwgInZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zIiwgImV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlIiwgDQogICAgICAgICAgICAgICAgInByb3Rlc3RzIiwgInN0cmF0ZWdpY19kZXZlbG9wbWVudHMiKSwgZGlnaXRzID0gMCkNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KDQojIyMgMTAuMyBSZWZlcmVuY2UgbWFwcw0KDQpgYGB7ciBwYXRjaHdvcmstbWFwcywgZmlnLmhlaWdodD0xNn0gDQphY2xlZCAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3RzIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgZnVsbF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gY291bnQpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJQZWFjZWZ1bCBwcm90ZXN0cyBoYXZlIGJlZW4gZXhjbHVkZWQiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gImNvbmZsaWN0IGV2ZW50cyIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuMikpICsNCiAgDQpmc2MgJT4lDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMSwgMywgNiwgOSwgMTIpKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGluIDIwMjEiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIiwNCiAgICAgICBmaWxsID0gIm51bWJlciBvZlxucGFydG5lcnMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKSArIA0KICANCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG5hX2lmKDApICU+JSANCiAgZnVsbF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZmF0YWxpdGllcyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiQ29uZmxpY3QgZmF0YWxpdGllcyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJmYXRhbGl0aWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkgKw0KICANCmZzYyAlPiUNCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odV9iZW4pLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMiwgdHJhbnMgPSAibG9nMTAiKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgaW4gMjAyMSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5iZW5lZmljaWFyaWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkNCg0KYGBgDQoNCkludGVyYWN0aXZlIHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlc2UgbWFwcyBjYW4gYmUgZm91bmQgKipbaGVyZV0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vYWNsZWRfbWFwcy8pKiouIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgbWFwcyBhcmUgcXVpdGUgbGFyZ2UgYW5kIHdpbGwgdGFrZSBhIGxvbmcgdGltZSB0byBsb2FkLiANCg0K